271

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


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

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

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

7 回答 7

598

这就是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();
});
于 2016-07-13T15:13:35.407 回答
259

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

代替

res.somevariable = variable1;

有:

req.somevariable = variable1;

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

于 2013-09-18T14:43:51.507 回答
40

我认为最佳实践不会传递像req.YOUR_VAR. 您可能要考虑req.YOUR_APP_NAME.YOUR_VARreq.mw_params.YOUR_VAR

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

2020 年 5 月 31 日更新

res.locals是您要查找的内容,该对象的范围仅限于请求。

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

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

于 2015-02-19T19:37:59.450 回答
7

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

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

于 2013-09-18T14:43:41.880 回答
5

诀窍很简单......请求周期仍然非常活跃。您可以添加一个新变量,该变量将创建一个临时调用

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
}
于 2018-06-28T10:26:23.073 回答
3

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

于 2019-02-04T00:37:08.697 回答
1

该应用程序现在使用 requestTime 中间件功能。此外,根路径路由的回调函数使用中间件函数添加到 req(请求对象)的属性。



var express = require('express')
var app = express()

var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

app.use(requestTime)

app.get('/', function (req, res) {
  var responseText = 'Hello World!<br>'
  responseText += '<small>Requested at: ' + req.requestTime + '</small>'
  res.send(responseText)
})

app.listen(3000)
于 2022-01-18T04:17:55.503 回答