Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js express中间件中mongoose对象的重用模式_Node.js_Express_Mongoose - Fatal编程技术网

Node.js express中间件中mongoose对象的重用模式

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

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

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

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并将其取出后,并不完全是您所期望的。