req.locals与res.locals与res.data与req.data与快速中间件中的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来通过不同的中间件获得相同的数据传播。 而且,看起来请求和响应对象在请求开始时都具有初始化为空对象的本地属性。

另外,还可以设置res.mydata或req.mydata属性呢?

从理论上讲,app.locals也可以用来通过不同的中间件传递这些数据,因为它将会持续存在于中间件中,但这与传统的app.locals的使用是相反的。 它更多地用于应用程序特定的数据。 在请求 – 响应周期结束时清除这些数据也是必要的,因此下一个请求可以使用相同的variables。

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

正如你所提到的,可以使用req.localsres.locals甚至你自己定义的键res.userData 。 除了命名,没有真正的区别。 话虽如此,但我会推荐使用res.locals因为这是官方Express.js文档中提到的唯一的一个:

res.locals一个对象,其中包含作用域为请求的响应局部variables,因此仅可用于在请求/响应周期(如果有)期间呈现的视图。 否则,这个属性和app.locals是一样的。

该属性对于公开请求级信息(如请求path名,authentication用户,用户设置等)非常有用。

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

因为它是正式logging的, res.locals属性被用于其他任何事情的可能性较小(向后兼容性)。 如果您挑选出自己的密钥,那么以后的Express.js版本将会覆盖您的数据,因为它们碰巧使用了相同的密钥。 这在使用res.locals时不会发生。 这也使新人更容易理解你的代码,因为大多数项目使用res.locals来存储中间件数据。