在快速中间件中重用mongoose对象的模式

时间:2013-03-12 22:35:44

标签: node.js express mongoose

鉴于nodejs,mongoose,mongodb,expressjs setup,我们有与权限/安全相关的路由来验证特定请求。例如:

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 个答案:

答案 0 :(得分:1)

这里有许多不同的解决方案。我会尽快给你几点。

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

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

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

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