使用Express.js中的next()将变量传递给下一个中间件

时间:2013-09-18 14:41:22

标签: javascript node.js express middleware next

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


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

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

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

6 个答案:

答案 0 :(得分:296)

这是 res.locals 对象的用途。不支持或记录直接在请求对象上设置变量。 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();
});

答案 1 :(得分:152)

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

而不是

res.somevariable = variable1;

有:

req.somevariable = variable1;

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

答案 2 :(得分:20)

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

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:1)

技巧很简单...请求周期仍然很活跃。您只需添加一个新变量即可创建临时调用

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
}

答案 5 :(得分:-1)

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