Node.js express中间件中mongoose对象的重用模式
给定nodejs、mongoose、mongodb、expressjs设置,我们拥有验证特定请求的权限/安全相关路由。例如:Node.js express中间件中mongoose对象的重用模式,node.js,express,mongoose,Node.js,Express,Mongoose,给定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
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为当前请求保留的值。将其保存在那里类似于缓存,但是只能在该请求期间访问。在后续请求中,必须重新蚀刻对象
请注意,无论您选择哪种选项,在几乎所有情况下,为常用访问对象实现某种缓存都会加快应用程序的速度。这里有许多不同的解决方案。我会尽快给你一些 1) 首先,将您的代码分离,以实际获取(以及所需的任何预处理)到用户模型中的函数中。其次,如果您没有用户模型,MVC方法将使您的代码在增长时更易于遵循。从这里,您可以很容易地缓存第一次调用的响应,并在第二次调用时将其返回,而无需从数据库中重新获取。看看Memcached或Redis之类的东西 2) 虽然这可能不是约定,但您可以将对象从中间件传递到主函数中。如果您确实选择这样做,请清楚地记录您所做的事情,以便将来的人们理解您的中间件调用next(req、res、obj)的原因,而不是通过将其替换为next()来“修复”它 3) 第三种方法是将对象保存到res.locals中(我相信这就是它现在的名称)。这些是Express为当前请求保留的值。将其保存在那里类似于缓存,但是只能在该请求期间访问。在后续请求中,必须重新蚀刻对象
请注意,无论您选择哪种选项,在几乎所有情况下,为常用访问对象实现某种缓存都会加快应用程序的速度。我通常从中间件向res.locals添加内容。比如
res.locals.student=user代码>然后您的最终函数可以查看res.locals——这也会将其暴露给响应/模板对象。比如res.locals.student=user代码>然后您的最终函数可以在res.locals中查找——这也会将其暴露给响应/模板对象。我确实注意到mongo对象并不是你们所期望的,一旦你们把它们放进redis并把它们拿出来,我使用了res.locals方法。我确实注意到,mongo对象在您将其放入redis并将其取出后,并不完全是您所期望的。