在Express源中哪里定义了router.get函数?

时间:2017-05-16 20:35:32

标签: javascript node.js express

我想看看express.Router.get的实施情况。

我从项目的index.js开始,查看了git上的快速源代码。

索引有module.exports = require('./lib/express')。该文件有var Router = require('./router')。该位置是一个目录,因此我检查了该目录中的index.js文件。果然它有:

var proto = module.exports = function(options) {
  var opts = options || {};

  function router(req, res, next) {
    router.handle(req, res, next);
  }

  // mixin Router class functions
  setPrototypeOf(router, proto)

  router.params = {};
  router._params = [];
  router.caseSensitive = opts.caseSensitive;
  router.mergeParams = opts.mergeParams;
  router.strict = opts.strict;
  router.stack = [];

  return router;
};

返回路由器功能的代码。但是,任何地方都没有定义.get函数。实际的功能定义在哪里?

注意:我询问您将使用的get功能: router.get('/', ...)

1 个答案:

答案 0 :(得分:1)

浏览Express v4.15.2我在express/lib/application.js(第468行)

中找到了以下内容
/**
 * Delegate `.VERB(...)` calls to `router.VERB(...)`.
 */

methods.forEach(function(method){
  app[method] = function(path){
    if (method === 'get' && arguments.length === 1) {
      // app.get(setting)
      return this.set(path);
    }

    this.lazyrouter();

    var route = this._router.route(path);
    route[method].apply(route, slice.call(arguments, 1));
    return this;
  };
});

其中this._router来自express/lib/router/index.js

根据您所寻找的内容,您可以:

  • express/lib/router/layer.js::match (line 110)检查此路线是否与path匹配,如果填充.params
  • express/lib/router/route.js::dispatch (line 98)req, res发送到该路由