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

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

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中加载学生。 有一个可以接受的模式来避免这种双重加载? 某种请求循环caching或传递模型的stream畅方式?

这里有许多不同的解决scheme。 我会尽力快速给你几个。

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

2)虽然可能不是惯例,但是可以将对象从中间件传递到主函数中。 如果你select这样做的话,记下你所做的事情,以便将来人们明白为什么你的中间件正在调用next(req,res,obj),而不是用next()replace它来修复它。

3)第三种方法是将对象保存到res.locals(我相信这就是现在所称的)。 这些是Express为当前请求保留的值。 将其保存在caching中将类似于caching,但只能在该请求期间访问。 在随后的请求中,对象将不得不被重新提交。

请注意,无论您select哪种方式,为常见访问的对象实现某种caching,在几乎所有情况下都会加快您的应用程序的速度。