在Express.js中使用next()将变量传递到下一个中​​间件

好吧,我的问题是我想将一些变量从第一个中间件传递给另一个中间件,我尝试这样做,但是有req.somevariable一个“给定为'undefined'”。


//app.js
..
app.get('/someurl/', middleware1, middleware2)
...

////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...

////middleware2
...
some conditions
...
variable = req.somevariable;
...
Gil2020/03/24 14:05:05

如上所述,res.locals是一种很好的方法(推荐)。有关如何在Express中执行此操作的快速教程,请参见此处

2020/03/24 14:05:05

那是因为reqres是两个不同的对象。

您需要在添加属性的同一对象上查找属性。

Mandy村村2020/03/24 14:05:05

我认为最佳做法不会传递类似的变量req.YOUR_VAR您可能要考虑req.YOUR_APP_NAME.YOUR_VARreq.mw_params.YOUR_VAR

这将帮助您避免覆盖其他属性。

小卤蛋2020/03/24 14:05:05

这就是res.locals对象的用途。不支持也不记录直接在请求对象上设置变量。保证res.locals在请求的生命周期内保持状态。

本地人

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

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

app.use(function(req, res, next) {
    res.locals.user = req.user;  
    res.locals.authenticated = !req.user.anonymous;
    next();
});

要在下一个中间件中检索变量:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});
Stafan2020/03/24 14:05:05

将变量附加到req对象,而不是res

代替

res.somevariable = variable1;

有:

req.somevariable = variable1;

正如其他人指出的那样,res.locals推荐的方法是通过中间件传递数据。