gpt4 book ai didi

node.js - 在 Express 中间件中重用 mongoose 对象的模式

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:28 25 4
gpt4 key购买 nike

给定一个nodejs、mongoose、mongodb、expressjs设置,我们有权限/安全相关的路由来验证特定的请求。例如:

permissionUtils.checkStudentWritePermissions = function(req, res, next){
//load this student from the mongoose db
//ensure the current user has permission to update this student
}

server.put("/api/student/:studentId/enroll",
permissionUtils.checkStudentWritePermissions, function(req, res, next){
//load student from the database, validate the changes
//update student in mongodb, send new version back to user
});

中间件很有用,因为我们确保当前用户在每种情况下都有权更新学生。 (代码重用等)您会注意到,在这两个示例中,我都从 mongodb 加载学生。是否有一个可接受的模式来避免这种双重加载?某种请求周期缓存或传递模型的巧妙方法?

最佳答案

这里有许多不同的解决方案。我会尽力快速给您一些。

1) 首先,将代码分开以实际提取(以及您需要的任何预处理)到用户模型中的函数中。其次,如果您没有用户模型,MVC 方法将使您的代码在增长时更容易遵循。从这里,您可以轻松地缓存第一次调用时的响应,并在第二次调用时将其返回,而无需从数据库重新获取。看看像 Memcached 或 Redis 这样的东西。

2)虽然这可能不符合惯例,但您可以将对象从中间件传递到主函数中。如果您确实选择这样做,请清楚地记录您所做的事情,以便将来的人了解为什么您的中间件调用 next(req, res, obj),并且不要通过仅将其替换为 next() 来“修复”它。

3)第三种方法是将对象保存到 res.locals 中(我相信这就是它现在的名称)。这些是 Express 为当前请求保留的值。将其保存在那里类似于缓存,但是只能在该请求期间访问。在后续请求中,必须重新获取该对象。

请注意,无论您选择哪个选项,为常用访问的对象实现某种缓存在几乎所有情况下都会加快您的应用程序的速度。

关于node.js - 在 Express 中间件中重用 mongoose 对象的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15373599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com