我想从第一个中间件传递一些变量到另一个中间件,我试着这样做,但有“req。有些变量是一个给定的‘未定义’”。


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

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

////middleware2
...
some conditions
...
variable = req.somevariable;
...

当前回答

诀窍很简单……请求周期仍然存在。您只需添加一个新变量,它将创建一个临时的调用

app.get('some/url/endpoint', middleware1, middleware2);

因为您可以在第一个中间件中处理请求

(req, res, next) => {
    var yourvalue = anyvalue
}

在中间件1中,你可以像下面这样处理你的逻辑并存储你的值:

req.anyvariable = yourvalue

在中间件2中,你可以通过以下方法从中间件1中获取这个值:

(req, res, next) => {
    var storedvalue = req.yourvalue
}

其他回答

我不认为最好的做法是传递一个像req.YOUR_VAR这样的变量。您可能需要考虑req.YOUR_APP_NAME。YOUR_VAR或req.mw_params.YOUR_VAR。

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

v4。x API文档

这就是res.locals对象的作用。不支持直接在请求对象上设置变量,也没有相关文档。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();
});

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

而不是

req.somevariable = variable1;

有:

res.locals.somevariable = variable1;

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

如上所述,res.locals是一种很好的(推荐的)方法。请参阅这里的快速教程,了解如何在Express中做到这一点。

诀窍很简单……请求周期仍然存在。您只需添加一个新变量,它将创建一个临时的调用

app.get('some/url/endpoint', middleware1, middleware2);

因为您可以在第一个中间件中处理请求

(req, res, next) => {
    var yourvalue = anyvalue
}

在中间件1中,你可以像下面这样处理你的逻辑并存储你的值:

req.anyvariable = yourvalue

在中间件2中,你可以通过以下方法从中间件1中获取这个值:

(req, res, next) => {
    var storedvalue = req.yourvalue
}