有人问过类似的问题,但我的问题是,如果我想传播通过不同路由中间件获得的中间结果,什么是最好的方法?
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用法相反。它更多地用于特定于应用程序的数据。还必须在请求- 响应周期结束时清除该数据,以便将相同的变量用于下一个请求。
通过中间件传播中间结果的最佳和标准方法是什么?
如前所述,可以使用req.locals,res.locals甚至res.userData可以使用您自己定义的密钥。但是,当将视图引擎与Express一起使用时,您可以res.locals在中间件中设置中间数据,并且这些数据将在您的视图中可用。通常的做法是在中间件内部设置中间数据req.locals,以免覆盖中的视图数据res.locals,尽管这尚未正式记录。
req.locals
res.locals
res.userData
res.locals 一个对象,该对象包含范围为请求的响应局部变量,因此仅可用于在该请求/响应周期(如果有)中呈现的视图。否则,此属性与相同app.locals。 此属性对于公开请求级别的信息很有用,例如请求路径名,经过身份验证的用户,用户设置等。 来源:http://expressjs.com/en/api.html#res.locals
res.locals 一个对象,该对象包含范围为请求的响应局部变量,因此仅可用于在该请求/响应周期(如果有)中呈现的视图。否则,此属性与相同app.locals。
app.locals
此属性对于公开请求级别的信息很有用,例如请求路径名,经过身份验证的用户,用户设置等。
来源:http://expressjs.com/en/api.html#res.locals