¿Qué es Connect, Express y el "middleware" de Node.js?
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?
[ 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
createServer
método devuelve un objeto que puede utilizar para responder a solicitudes HTTP. Ese objeto hereda elhttp.Server
prototipo.Connect también ofrece un
createServer
método que devuelve un objeto que hereda una versión extendida dehttp.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
createServer
método que amplía el prototipo de ConnectServer
. 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.static
es lo mismo que connect.static
. (Ambos eran conocidos como staticProvider
hasta 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.
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 app
que puede:
- Puede manejar una solicitud y devolver una respuesta. Esto se debe a que básicamente obtienes esta función.
- 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, http
de modo que no sea necesario realizar la llamada http.createServer(app)
. Se llama listen
y 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.createServer
con 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 use
función. Express no depende de Connect ( consulte package.json ). Sin embargo, hace todo lo que hace la conexión, es decir:
- Se puede registrar con
createServer
like connect ya que también es solo una función que puede tomar unreq
parres
( fuente ). - Una función de uso para registrar middleware .
- Una
listen
función de utilidad para registrarse con http
Además de lo que proporciona Connect (que expresa duplicados), tiene muchas funciones más. p.ej
- Tiene soporte para motor de visualización .
- Tiene verbos de nivel superior (obtener/publicar, etc.) para su enrutador .
- Tiene soporte para la configuración de la aplicación .
El middleware es compartido.
La use
funció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.createServer
si 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 de
http.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