use*_*897 161 javascript middleware next node.js express
好吧,我的问题是我想将一些变量从第一个中间件传递到另一个中间件,我尝试这样做,但是" req.somevariable
有一个给定为'undefined'".
//app.js
..
app.get('/someurl/', middleware1, middleware2)
...
Run Code Online (Sandbox Code Playgroud)
////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...
Run Code Online (Sandbox Code Playgroud)
////middleware2
...
some conditions
...
variable = req.somevariable;
...
Run Code Online (Sandbox Code Playgroud)
cch*_*ain 347
这就是res.locals对象的用途.不支持或记录直接在请求对象上设置变量.res.locals保证在请求的整个生命周期内保持状态.
包含作用于请求的响应局部变量的对象,因此仅对在请求/响应周期(如果有)期间呈现的视图可用.否则,此属性与app.locals相同.
此属性对于公开请求级别信息(例如请求路径名,经过身份验证的用户,用户设置等)非常有用.
app.use(function(req, res, next) {
res.locals.user = req.user;
res.locals.authenticated = !req.user.anonymous;
next();
});
Run Code Online (Sandbox Code Playgroud)
要在下一个中间件中检索变量:
app.use(function(req, res, next) {
if (res.locals.authenticated) {
console.log(res.locals.user.id);
}
next();
});
Run Code Online (Sandbox Code Playgroud)
Amb*_*mps 167
将变量附加到req
对象,而不是res
.
代替
res.somevariable = variable1;
Run Code Online (Sandbox Code Playgroud)
有:
req.somevariable = variable1;
Run Code Online (Sandbox Code Playgroud)
正如其他人所指出的那样,res.locals
是推荐通过中间件传递数据的方法.
Nie*_*ard 41
将变量传递到其他中间件和端点函数的最常见模式是将值附加到请求对象req
。
就您而言,这意味着拥有如下中间件:
\napp.use(function (req, res, next) {\n req.someVariable = 123;\n next();\n});\n\napp.use(function (req, res, next) {\n console.log("The variable is", req.someVariable);\n next();\n});\n
Run Code Online (Sandbox Code Playgroud)\n这种模式有许多常见的用例,并且它是 Express 社区中执行此操作的标准方法。例如,参见:
\n值得注意的是,当前投票最高的答案错误地建议用于res.locals
此目的——这似乎源于对文档的误读。因此,我将详细说明为什么这不是解决该问题的常用方法(尽管它也不是特别有害)。
res.locals
作为该方法适合该案例的支持证据,引用了现已过时的文档:
\n\n包含作用域为请求的响应局部变量的对象,因此仅可用于在该请求/响应周期(如果有)期间呈现的视图。否则,此属性与 app.locals 相同。
\n此属性对于公开请求级别信息非常有用,例如请求路径名称、经过身份验证的用户、用户设置等。
\n
请注意此处的框架:res.locals
仅适用于“在该请求期间呈现的视图”可用的变量(添加了强调)。
这就是res.locals
相关的。res.render
使用一些给定的数据渲染一些模板文件以及对本地数据的访问。这实际上在v2 文档中更加清楚,我们现在更新了当前的 Express 文档以使其更加清晰:
\n\n使用此属性可以设置在使用 res.render 渲染的模板中可访问的变量。res.locals 上设置的变量在单个请求-响应周期内可用,并且不会在请求之间共享。
\n为了保留局部变量用于请求之间的模板渲染,请改用 app.locals。
\n此属性对于向应用程序中呈现的模板公开请求级信息(例如请求路径名称、经过身份验证的用户、用户设置等)非常有用。
\n
(强调是添加的。)
\n扩展成为标准方法的进一步证据可以在编写中间件req
指南中找到,其中指出:
\n\n接下来,我们\xe2\x80\x99将创建一个名为\xe2\x80\x9crequestTime\xe2\x80\x9d的中间件函数,并向请求对象添加一个名为requestTime的属性。
\nRun Code Online (Sandbox Code Playgroud)\nconst requestTime = function (req, res, next) {\n req.requestTime = Date.now()\n next()\n}\n
当在关于此问题的答案的讨论中提到这一点时,一位用户回答道:“这是在添加 res.locals 之前您执行此操作的方式,因此可能是旧文档。res.locals 是专门用于此目的的命名空间”。
\n然而,这与代码库的历史无关:本地变量自 v2 以来就已经存在,这明显早于将 egexpress.json
包含在库中的时间,此时更改行为是有意义的,如果它确实是这样的话正确保存值res.locals
。
Dor*_*gal 21
我不认为最佳实践会传递变量之类的req.YOUR_VAR
.你可能想要考虑req.YOUR_APP_NAME.YOUR_VAR
或req.mw_params.YOUR_VAR
.
它将帮助您避免覆盖其他属性.
诀窍很简单......请求周期仍然很活跃。您可以添加一个新变量来创建一个临时的,调用
app.get('some/url/endpoint', middleware1, middleware2);
Run Code Online (Sandbox Code Playgroud)
由于您可以在第一个中间件中处理您的请求
(req, res, next) => {
var yourvalue = anyvalue
}
Run Code Online (Sandbox Code Playgroud)
在中间件 1 中,您处理您的逻辑并存储您的值,如下所示:
req.anyvariable = yourvalue
Run Code Online (Sandbox Code Playgroud)
在中间件 2 中,您可以从中间件 1 中捕获此值,执行以下操作:
(req, res, next) => {
var storedvalue = req.yourvalue
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
93618 次 |
最近记录: |