Node.js Подключить код createServer

Я читаю Node.js Connect версии 2.15.0:

/**
 * Create a new connect server.
 *
 * @return {Function}
 * @api public
 */

function createServer() {
  function app(req, res, next){ app.handle(req, res, next); }
  utils.merge(app, proto);
  utils.merge(app, EventEmitter.prototype);
  app.route = '/';
  app.stack = []; 
  for (var i = 0; i < arguments.length; ++i) {
    app.use(arguments[i]);
  }
  return app;
};

Несколько вопросов:

  1. app.handle, по-видимому, предоставляется в proto, поскольку в proto.js определено app.handle. Итак, это использование замыкания, и app.handle определяется не в то время, когда Node анализирует function app(), а позже в коде? Также сам app определен в..эээ..function app(). Код кажется мне забавным.

  2. Когда вызывается function app()? Все, что я знаю, create server создает сервер. Итак, когда я буду вызывать эту функцию и как? Делаю ли я что-то вроде:

    app = createServer()
    app.listen(3000)
    app(req, res, next)
    
  3. utils.merge() просто говорит

    exports.merge = function(a, b){ 
      if (a && b) {
        for (var key in b) {
          a[key] = b[key];
        }   
      }
      return a;
    };
    

    Это обычная практика вместо наследования или что? Мне кажется mixin.


person huggie    schedule 13.05.2014    source источник


Ответы (1)


  1. app.handle, по-видимому, предоставляется в proto, поскольку в proto.js определено app.handle. Итак, это использование замыкания, и app.handle определяется не в то время, когда Node анализирует function app(), а позже в коде? Также сам app определен в..эээ..function app(). Код кажется мне забавным.

Да, app.handle происходит от proto. Но нет, доступ к app внутри функции app не является замыканием, функция доступна по имени во всех объявлениях функций.

2. Когда вызывается function app()? Все, что я знаю, createServer создает сервер. Итак, когда я буду вызывать эту функцию и как?

В документах по подключению используется следующий пример кода:

var app = connect();
…
http.createServer(app).listen(3000);

Вы можете видеть, что connect (это функция createServer, которую вы опубликовали) действительно создает app, который передается как обработчик фактическому http-серверу.

3. Является ли utils.merge() обычной практикой вместо наследования или что? Мне кажется mixin.

Да, merge смешивает один объект с другим. Это делается для расширения функционального объекта app всеми необходимыми методами. Это необходимо, потому что невозможно определить функцию с цепочкой прототипов стандартным способом. Возможно, они также использовали что-то в этом роде:

app.__proto__ = utils.merge(Object.create(EventEmitter.prototype), proto);

но тогда app больше не будет instanceof Function; и не имеют методов-функций.

person Bergi    schedule 13.05.2014
comment
Спасибо за 1. Мне нужно немного поразмыслить над 3. Что касается 2, var app является результатом функции createServer(), которую я опубликовал. Как http.createServer() выполняет строку app.handle(req, res, next) внутри createServer(), которую я разместил? - person huggie; 13.05.2014
comment
http.createServer(…) эквивалентно (new http.Server).addListener('request', …). Выясните, где и как возникает это событие. - person Bergi; 13.05.2014