Express中间件中的req.locals与res.locals与res.data,req.data与app.locals


82

有人问过类似的问题,但我的问题是,如果我想传播通过不同路由中间件得到的中间结果,什么是最好的方法?

app.use(f1); app.use(f2); app.use(f3);

function f1(req,res,next) {
  //some database queries are executed and I get results, say x1
  res.locals.dbResults = {...};
  next();
}

function f2(req,res,next) {
  // more processing based upon req.locals.dbResults 
  res.locals.moreResults = {....};
  next();
}
// ...

我认为我可以通过使用req .locals通过不同的中间件获得相同的数据传播。同样,请求和响应对象似乎都具有在请求开始时初始化为空对象的locals属性。

另外,也可以设置res.mydata或req.mydata属性吗?

从理论上讲,app.locals也可以用于通过不同的中间件传递这些数据,因为它们会在中间件之间持久存在,但这与传统的app.locals用法相反。它更多地用于特定于应用程序的数据。还必须在请求-响应周期结束时清除该数据,以便将相同的变量用于下一个请求。

通过中间件传播中间结果的最佳和标准方法是什么?

Answers:


151

如前所述,可以使用req.locals,res.locals甚至res.userData可以使用自己定义的密钥。但是,将视图引擎与Express一起使用时,您可以res.locals在中间件中设置中间数据,并且这些数据将在您的视图中可用(请参阅本文)。通常的做法是在中间件内部设置中间数据req.locals,以免覆盖中的视图数据res.locals,尽管尚未正式记录。

res.locals 一个对象,包含响应范围为请求的局部变量,因此仅可用于在该请求/响应周期中呈现的视图(如果有)。否则,此属性与相同app.locals。

此属性对于公开请求级别的信息很有用,例如请求路径名,经过身份验证的用户,用户设置等。

来源:http://expressjs.com/en/api.html#res.locals


感谢您对有助于res.locals的文档区别的澄清。您证实了我的理解,即理论上所有方法在技术上都是相同的。让我们等待更多评论。支持您的答案...肯定有用。
— 2015年

旁注:res.render()优先于res.locals。因此有人可能会像这样不小心覆盖变量res.locals = { name: 'Jake' } // later in code... res.render('user.template', { name: 'Tony' }, (err, html) => {}) // the 'name' variable is now 'Tony'
— zenoh

无论如何,经过精心计划,干净和模块化的中间件设计应该是比仅依靠单个对象密钥更好的长期解决方案
— zenoh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.