提问者:小点点

Express中间件中的Req.Locals vs.Res.Locals vs.Res.Data vs.Req.Data vs.App.Locals


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

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个答案

匿名用户

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

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

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

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