Node.js Conecta el código createServer

Estoy leyendo Node.js Connect versión 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; }; 

Unas cuantas preguntas:

  1. app.handle parece ser proporcionado en proto, ya que hay app.handle definido en proto.js. Entonces, ¿esto es un uso de un cierre, y app.handle se define no en el momento en que Node analiza la function app() sino más adelante en el código? También la app sí misma está definida en … uh … function app() . El código me parece gracioso.

  2. ¿Cuándo se invoca la function app() ? Todo lo que sé crear servidor crea el servidor. Entonces, ¿cuándo invocaré esa función y cómo? Hago algo como

     app = createServer() app.listen(3000) app(req, res, next) 
  3. utils.merge () simplemente dice

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

    ¿Es una práctica común hacer en lugar de la herencia o qué? A mi me parece una mixin .

  1. app.handle parece ser proporcionado en proto, ya que hay app.handle definido en proto.js. Entonces, ¿esto es un uso de un cierre, y app.handle se define no en el momento en que Node analiza la function app() sino más adelante en el código? También la app sí misma está definida en … uh … function app() . El código me parece gracioso.

Sí, app.handle viene de proto . Pero no, acceder a la app dentro de la función de la app no es un cierre, una función está disponible por su nombre en todas las declaraciones de funciones.

2. ¿Cuándo se invoca la function app() ? Todo lo que sé createServer crea el servidor. Entonces, ¿cuándo invocaré esa función y cómo?

Los documentos de conexión utilizan este código de ejemplo:

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

Puede ver que connect (que es la función createServer que publicó) crea la app , que se pasa como un controlador al servidor http real.

3. ¿Es utils.merge() una práctica común en lugar de una herencia o qué? A mi me parece una mixin .

Sí, merge un objeto con el otro. Esto se hace para extender la app objeto de función con todos los métodos necesarios. Es necesario porque es imposible definir una función con una cadena de prototipo de forma estándar. También podrían haber usado algo en este sentido:

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

pero entonces la app ya no sería instanceof Function ; y no tienen métodos de función.