这可能不是我的正确方法,但我想有条件地将一个对象/参数添加到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
稍后要呈现的内容,而是稍后将在执行链中用于路由和套接字的内容。
答案 0 :(得分:102)
请求对象具有app
字段。只需使用req.app
即可访问app
变量。
答案 1 :(得分:10)
一般来说,我会做以下事情。
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
}
}
答案 2 :(得分:3)
您还可以将变量附加到Node全局对象,如下所示:
//some-module.js
global.someVariable = "some value!";
//another-module.js
console.log(global.someVariable); // => "some value!"
请注意,Nitzan Shaked的答案(使用req.app)是一种更好的方法。
事实上,我根本不建议使用此解决方案。我只是为了完整性而离开它,因为它有效,但在几乎所有情况下都是不好的做法(除了添加polyfills)。