express4.x的app.use与router.use的优先级
发布于 10 年前 作者 icarusysuper 11161 次浏览 最后一次编辑是 8 年前

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。

这个问题,再翻阅文档,最后得到答案。 要向你学习这种思考的方式,感谢。

回到顶部