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

时间:2015-10-31 11:31:59

标签: node.js express middleware

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

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的传统使用相反。它更多地用于特定于应用程序的数据。还需要在请求 - 响应周期结束时清除该数据,以便相同的变量可用于下一个请求。

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

1 个答案:

答案 0 :(得分:100)

正如您所提到的,可以使用req.localsres.locals甚至您自己定义的密钥res.userData。但是,在使用带有Express的视图引擎时,您可以在中间件中的res.locals上设置中间数据,并且该数据将在您的视图中可用(请参阅this post)。通常的做法是在req.locals上设置中间件内部的中间数据,以避免覆盖res.locals中的视图数据,尽管这没有正式记录。

  

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

     

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

     

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