¿Qué es Connect, Express y el "middleware" de Node.js?

Resuelto tillda asked hace 13 años • 9 respuestas

A pesar de conocer bastante bien JavaScript, no estoy confundido sobre qué hacen exactamente estos tres proyectos en el ecosistema Node.js. ¿Es algo así como Rails' Rack? ¿Alguien puede explicarlo?

tillda avatar Mar 13 '11 00:03 tillda
Aceptado

[ Actualización: a partir de su versión 4.0, Express ya no usa Connect. Sin embargo, Express sigue siendo compatible con el middleware escrito para Connect. Mi respuesta original está a continuación.]

Me alegra que hayas preguntado sobre esto, porque definitivamente es un punto común de confusión para las personas que buscan Node.js. Aquí está mi mejor oportunidad para explicarlo:

  • El propio Node.js ofrece un módulo http , cuyo createServermétodo devuelve un objeto que puede utilizar para responder a solicitudes HTTP. Ese objeto hereda el http.Serverprototipo.

  • Connect también ofrece un createServermétodo que devuelve un objeto que hereda una versión extendida de http.Server. Las extensiones de Connect están ahí principalmente para facilitar la conexión del middleware . Es por eso que Connect se describe a sí mismo como un "marco de middleware" y, a menudo, se lo compara con Ruby's Rack.

  • Express hace con Connect lo que Connect hace con el módulo http: ofrece un createServermétodo que amplía el prototipo de Connect Server. Así que toda la funcionalidad de Connect está ahí, además de ver renderizado y un práctico DSL para describir rutas. El Sinatra de Ruby es una buena analogía.

  • Luego hay otros marcos que van aún más allá y amplían Express! Zappa , por ejemplo, que integra soporte para CoffeeScript, jQuery del lado del servidor y pruebas.

A continuación se muestra un ejemplo concreto de lo que se entiende por "middleware": nada de lo anterior sirve archivos estáticos. Pero simplemente agregue connect.static(un middleware que viene con Connect), configurado para apuntar a un directorio, y su servidor brindará acceso a los archivos en ese directorio. Tenga en cuenta que Express también proporciona middlewares de Connect; express.statices lo mismo que connect.static. (Ambos eran conocidos como staticProviderhasta hace poco).

Mi impresión es que la mayoría de las aplicaciones Node.js "reales" se están desarrollando con Express en estos días; las funciones que agrega son extremadamente útiles y todas las funciones de nivel inferior siguen ahí si las desea.

Trevor Burnham avatar Mar 13 '2011 15:03 Trevor Burnham

La respuesta aceptada es muy antigua (y ahora incorrecta). Aquí está la información (con fuente) basada en la versión actual de Connect (3.0)/Express (4.0).

Con qué viene Node.js

http / https createServer que simplemente recibe una devolución de llamada (req,res), por ejemplo

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

¿Qué agrega Connect?

El middleware es básicamente cualquier software que se encuentre entre el código de su aplicación y alguna API de bajo nivel. Connect amplía la funcionalidad del servidor HTTP integrado y agrega un marco de complementos. Los complementos actúan como middleware y, por lo tanto, connect es un marco de middleware.

La forma en que lo hace es bastante simple (¡ y de hecho el código es muy corto! ). Tan pronto como llamas, var connect = require('connect'); var app = connect();obtienes una función appque puede:

  1. Puede manejar una solicitud y devolver una respuesta. Esto se debe a que básicamente obtienes esta función.
  2. Tiene una función miembro .use( fuente ) para administrar complementos ( que proviene de aquí debido a esta simple línea de código ).

Debido a 1.) puedes hacer lo siguiente:

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);

Combina con 2.) y obtienes:

var connect = require('connect');

// Create a connect dispatcher
var app = connect()
      // register a middleware
      .use(function (req, res, next) { next(); });

// Register with http
http.createServer(app)
    .listen(3000);

Connect proporciona una función de utilidad para registrarse, httpde modo que no sea necesario realizar la llamada http.createServer(app). Se llama listeny el código simplemente crea un nuevo servidor http, registra la conexión como devolución de llamada y reenvía los argumentos a http.listen. De la fuente

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

Entonces, puedes hacer:

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');

Sigue siendo el viejo http.createServercon un marco de complementos en la parte superior.

Lo que añade ExpressJS

ExpressJS y connect son proyectos paralelos. Connect es solo un marco de middleware, con una buena usefunción. Express no depende de Connect ( consulte package.json ). Sin embargo, hace todo lo que hace la conexión, es decir:

  1. Se puede registrar con createServerlike connect ya que también es solo una función que puede tomar un reqpar res( fuente ).
  2. Una función de uso para registrar middleware .
  3. Una listenfunción de utilidad para registrarse con http

Además de lo que proporciona Connect (que expresa duplicados), tiene muchas funciones más. p.ej

  1. Tiene soporte para motor de visualización .
  2. Tiene verbos de nivel superior (obtener/publicar, etc.) para su enrutador .
  3. Tiene soporte para la configuración de la aplicación .

El middleware es compartido.

La usefunción de ExpressJS y connect es compatible y por tanto el middleware es compartido . Ambos son marcos de middleware, pero Express tiene más que un simple marco de middleware .

¿Cual deberías usar?

Mi opinión: estás lo suficientemente informado ^basado en lo anterior^ para tomar tu propia decisión.

  • Úselo http.createServersi está creando algo como connect/expressjs desde cero.
  • Utilice connect si está creando middleware, probando protocolos, etc., ya que es una buena abstracción además dehttp.createServer
  • Utilice ExpressJS si está creando sitios web.

La mayoría de la gente debería simplemente usar ExpressJS.

¿Qué hay de malo en la respuesta aceptada?

Esto podría haber sido cierto en algún momento, pero ahora es incorrecto:

que hereda una versión extendida de http.Server

Equivocado. No lo extiende y como has visto... lo usa

Express hace con Connect lo que Connect hace con el módulo http

Express 4.0 ni siquiera depende de la conexión. consulte la sección actual de dependencias de package.json

basarat avatar May 30 '2014 15:05 basarat