【问题标题】:pattern for reusing mongoose objects in express middleware在 express 中间件中重用 mongoose 对象的模式
【发布时间】:2013-03-13 08:19:38
【问题描述】:

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

【问题讨论】:

  • 我通常从中间件向 res.locals 添加东西。就像res.locals.student = user; 一样,你的最终函数可以在 res.locals 中查找——这也会将其暴露给响应/模板对象。

标签: node.js express mongoose


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我使用了 res.locals 方法。我确实注意到,一旦将 mongo 对象放入 redis 并将它们拉出,它们并不完全符合您的期望。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 2014-10-12
  • 2012-08-26
  • 2018-02-28
  • 2015-04-15
  • 2016-05-22
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多