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

2020/10/15 06:21 · javascript ·  · 0评论

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


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

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

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

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

代替

res.somevariable = variable1;

有:

req.somevariable = variable1;

正如其他人指出的那样,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();
});

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

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

2020年5月31日更新

res.locals是您要寻找的对象,该对象的作用域是请求。

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

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

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

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

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

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
}

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

本文地址:http://javascript.askforanswer.com/zaiexpress-jszhongshiyongnextjiangbianliangchuandidaoxiayigezhongjianjian.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!