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, тъй като има app.handle дефиниран в proto.js. И така, това е използване на затваряне и 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, тъй като има app.handle дефиниран в proto.js. И така, това е използване на затваряне и 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