有没有办法在Express堆栈中注入中间件?我的意思是我想让我的app.js设置主要的中间件链,然后调用其他模块传递app实例,他们可能想要插入更多的中间件(例如,想要在正确的地方添加护照的认证模块)
答案 0 :(得分:12)
您当然可以将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
实际上是由proto.js中的Connect提供的:
app.use = function(route, fn){
...
this.stack.push({ route: route, handle: fn });
return this;
};
技术上,您可以自己动手app.stack
,但我不会这样做。你会搞乱一个没有文档的实现细节,这个细节很容易改变。换句话说,将来 Connect或Express的更新可能会破坏您的应用。
答案 1 :(得分:1)
你可以使用app.use(fn)或像这样堆叠它们:
app.get('/foo', fn1, fn2, fn3);
签名必须始终相同并调用next();
function(req, res, next) {
next();
}
答案 2 :(得分:0)
我不明白这是什么问题?
您可以在中间件中添加任何功能:
app.use(function(req,res,next){
//some munipulation with req and res
next()
})
你可以将这个app
发送给你的模块