express4.x的app.use与router.use的优先级
express4.x,将express的自带中间件都独立出来了。独立出来的一个模块还有router。 想请问下。这之后,app.use与router.use这两个方法注册的中间件执行时有优先级吗。
3 回复
补充下说明。执行时的优先级指的是。.use方法在express3.x及之前是先注册,先响应。 然后现在有两个对象下的.use方法(app.use和router.use),他们注册的中间件执行时天生就有优先级别吗。(举个 极端的例子就是是先响应完app.use再响应router.use。还是仍然一视同仁,先注册,先响应?)
看源码就知道了,app.use调用的是Router的实例_router.use,即Router的原型方法,跟router.use一样
this._router = new Router({
caseSensitive: this.enabled('case sensitive routing'),
strict: this.enabled('strict routing')
});
var proto = module.exports = function(options) {
options = options || {};
function router(req, res, next) {
router.handle(req, res, next);
}
// mixin Router class functions
router.__proto__ = proto;
router.params = {};
router._params = [];
router.caseSensitive = options.caseSensitive;
router.strict = options.strict;
router.stack = [];
return router;
};
但是看调用每次调用组件’var router = express.Router([options]);'都是返回一个新的function,有自己的stack。
最后,看了一下文档…
router.use
需要调用app.use('/foo', router);
才会生效啊!所以没有优先级的关系。
最后一句正解啊!没有认真重新看文档。当时想着问题的时候也懒得去找源码看,惭愧= =。佩服你思考的方式。从源码出发,然后发现
但是看调用每次调用组件'var router = express.Router([options]);'都是返回一个新的function,有自己的stack。
这个问题,再翻阅文档,最后得到答案。 要向你学习这种思考的方式,感谢。