有没有一种方法在Express堆栈中注入中间件?我的意思是,我希望我的app.js设置主要的中间件链,然后调用其他模块传递app实例,他们可能想要插入更多的中间件(例如一个认证模块,想在正确的位置添加护照)
你可以把你的app
对象传递给其他模块,并在那里调用use
。当然,中间件函数的执行顺序是按添加的顺序执行的,因此您必须非常小心地确保以正确的顺序调用use
。
app.js
var app = express();
// ...
app.use(express.logger()); // first middleware function
var someOtherModule = require('./mod.js');
someOtherModule.init(app);
app.use(express.static()); // last middleware function)
mod.js
exports.init = function(app) {
app.use(function(req, res, next) {
});
};
如果你已经使用了一组中间件函数调用app.use
,并且希望在堆栈的中间注入一个中间件函数,目前没有文档记录的方法来实现它。 use
只会将一个函数加到堆栈的末尾。
use
实际上是由 Connect 在 proto.js 中提供的:
app.use = function(route, fn){
...
this.stack.push({ route: route, handle: fn });
return this;
};
从技术角度来说,您可以自己调整 app.stack
,但是我不建议这样做。您会干扰一个未经记录的实现细节,而这个细节有可能会发生改变。换句话说,未来 无论是 Connect 还是 Express 的更新都有可能破坏您的应用程序。
你可以使用 app.use(fn) 或者像这样堆叠它们:
app.get('/foo', fn1, fn2, fn3);
签名必须始终相同并调用next();
function(req, res, next) {
next();
}
我不明白问题出在哪里?
你可以在中间件中添加任何函数:
app.use(function(req,res,next){
//some munipulation with req and res
next()
})
你可以将这个应用程序
发送到你的模块中
app.use
总是将你的中间件函数添加到堆栈末尾,因此较早添加的中间件可能在你的函数有机会运行之前就完成了对请求的处理。 - josh3736