访问 ExpressJS/ConnectJS 中间件中的“app”变量?
Posted
技术标签:
【中文标题】访问 ExpressJS/ConnectJS 中间件中的“app”变量?【英文标题】:Access "app" variable inside of ExpressJS/ConnectJS middleware? 【发布时间】:2013-09-23 16:18:52 【问题描述】:这可能不是我正确的方法,但我想有条件地将对象/参数添加到 expressJS/connectjS 中间件调用内的app
变量。
由于此函数是回调,从中间件调用内部访问app
的标准/最佳方式是什么?
//app.js
var myMiddleware = require('./lib/mymiddleware.js');
...
app.configure( function()
app.use( myMiddleware.func() );
...
if( 'object' !== typeof app.myObject )
cry( 'about it' );
//mymiddleware.js
module.exports.func = function( )
return function( req, res, next )
//append app object
//app.myObject =
next();
;
注意,这不是 locals
或 settings
稍后渲染的东西,而是稍后将在执行链中用于路由和套接字的东西。
【问题讨论】:
【参考方案1】:请求对象有一个app
字段。只需使用req.app
即可访问app
变量。
【讨论】:
【参考方案2】:通常我会执行以下操作。
var myMiddleware = require('./lib/mymiddleware.js')(app);
...
app.configure( function()
app.use( myMiddleware );
...
中间件看起来像这样......
module.exports = function(app)
app.doStuff.blah()
return function(req, res, next)
// actual middleware
【讨论】:
我的做法和你一样,不过我喜欢req.app
解决方案。不知道这是可能的。
@Plato 我刚刚意识到的问题是这只会更新页面请求上的应用程序对象,我需要在启动过程中更新应用程序对象。
是否有另一种方法可以让应用程序进入函数而不将其传递给 require 函数?
@qdeninja:如果这是您的新要求,您应该编辑问题。无论如何,我不清楚“在应用程序启动时”的意思是:请求之外没有req
(即:启动时),而您具体说的是“中间件”,这意味着请求,所以我的原始答案应该是好的。还是我错过了什么?
@NitzanShaked 我之前并没有真正了解中间件是如何工作的,现在我明白中间件只在页面加载时运行,而不是在启动时运行。我需要在启动阶段更新应用程序对象,以设置全局属性。不过,我希望有一种更标准的方法来做到这一点。当我实际测试您的代码时,我意识到这不是我想要的,我很抱歉。尽管我认为从我写的代码中可以很清楚地看到我正在尝试做的事情typeof app.myObject
。要求没有改变,我对问题的理解改变了。【参考方案3】:
您还可以将变量附加到 Node 全局对象,如下所示:
//some-module.js
global.someVariable = "some value!";
//another-module.js
console.log(global.someVariable); // => "some value!"
请注意,Nitzan Shaked 的回答(使用 req.app)是一种更好的方法。
事实上,我根本不建议使用此解决方案。我只是为了完整性而保留它,因为它可以工作,但在几乎所有情况下(添加 polyfill 除外)都是不好的做法。
【讨论】:
以上是关于访问 ExpressJS/ConnectJS 中间件中的“app”变量?的主要内容,如果未能解决你的问题,请参考以下文章