美文网首页
Connect 模块源码解读

Connect 模块源码解读

作者: KEEEPer | 来源:发表于2017-08-27 00:08 被阅读18次

    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 || '<anonymous>', 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 模块源码解读

          本文链接:https://www.haomeiwen.com/subject/wazvdxtx.html