1

给定一个 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 加载学生。是否有一种可接受的模式来避免这种双重加载?某种请求周期缓存或传递模型的巧妙方式?

4

1 回答 1

1

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

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

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

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

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

于 2013-03-12T23:04:37.190 回答