Connect 模块源码解读

connect模块的源码解读
源码链接
读了好几天connect的源码,我也来写写我的理解

function createServer() {
  function app(req, res, next){ app.handle(req, res, next); }
  merge(app, proto);    //merge工具的使用,把两个对象的 *属性* 挖出来合并到一个对象之中
  merge(app, EventEmitter.prototype);
  app.route = '/';
  app.stack = [];
  return app;
}

proto是一个需要和app对象合并的对象


proto.listen = function listen() {
  var server = http.createServer(this); //this其实指代的是app对象,app是一个函数对象
  return server.listen.apply(server, arguments);
};

call 函数

/**
 * Invoke a route handle.
 * @private
 */

function call(handle, route, err, req, res, next) {
//handle函数的参数个数(3个参数为一般中间件,4个参数为错误处理中间件)
  var arity = handle.length; //arity是参数数量的意思,这里handle.length是对函数调用length,意味着获取函数的期望参数的个数
//是否有错误
  var error = err;
  var hasError = Boolean(err);

  debug('%s %s : %s', handle.name || '', route, req.originalUrl);

  try {

    if (hasError && arity === 4) { //如果有错误而且handle函数是一个错误处理中间件
      // error-handling middleware
      handle(err, req, res, next);
      return; //函数被切断
    } else if (!hasError && arity < 4) {
      // request-handling middleware
      handle(req, res, next);
      return; //函数被切断
    }
  } catch (e) {
    // replace the error
    error = e;
  }

  // continue
  next(error);
}

你可能感兴趣的:(Connect 模块源码解读)