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

Posted

技术标签:

【中文标题】Express 中间件中的 req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals【英文标题】:req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals in Express middleware 【发布时间】:2016-01-31 18:26:18 【问题描述】:

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

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

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

【问题讨论】:

相关 - ***.com/questions/35111143/… 【参考方案1】:

正如您所提到的,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

【讨论】:

感谢您澄清有利于 res.locals 的文档区别。您证实了我的理解,即理论上所有方法在技术上都是相同的。让我们等待更多的cmets。赞成您的回答...当然有用。 旁注: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'那样覆盖变量 无论如何,精心策划、干净和模块化的中间件设计应该是比仅仅依赖单个对象键更好且长期的解决方案

以上是关于Express 中间件中的 req.locals vs. res.locals vs. res.data vs. req.data vs. app.locals的主要内容,如果未能解决你的问题,请参考以下文章

express中的中间件理解

express.js 中的中间件功能范围

express中的中间件

Connect/Express 中的“session”和“cookieSession”中间件有啥区别?

Express JS 中的中间件是啥

对除特定路径之外的所有路径使用 Express 中的特定中间件