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

634

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

tillda
fuente
1
No he usado connect, pero esta página seguramente suena análoga a Rails 'Rack. ¿Entiendes qué es el middleware, fuera del contexto de Node?
Matt Ball
Honestamente, no tanto como me gustaría. Por lo que sé, es la capa la que hace todas las cosas previas a la aplicación, como enrutamiento, gzipping, encabezados, cookies ... Estoy en lo cierto? Entonces, ¿funciona de manera que el enrutamiento al controlador / acción MVC adecuado no esté dentro del marco MVC (como Rails), sino en el middleware?
tillda
8
Esto borrará todas sus dudas y responderá muchas más preguntas que tenga. Entiendo que es demasiado tarde (espero que alguien se desplace hacia abajo ...), pero leer el siguiente artículo del blog aclarará todas las preguntas que tenga sobre Connect, Express y Middleware. . También te enseña un poco sobre Node.js también. http://evanhahn.com/understanding-express/
DotNetInfo
@DiegoCaxito Su enlace está roto.
Mástil

Respuestas:

891

[ 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á abajo.]

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

  • Node.js en sí ofrece un módulo http , cuyo createServermétodo devuelve un objeto que puede usar 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 principalmente allí para facilitar la conexión de middleware . Es por eso que Connect se describe a sí mismo como un "marco de middleware" y, a menudo, se compara con Ruby's Rack.

  • Express hace lo que Connect hace al módulo http: ofrece un createServermétodo que extiende el Serverprototipo de Connect . De modo que toda la funcionalidad de Connect está ahí, además del renderizado de vistas y un práctico DSL para describir rutas. Sinatra de Ruby es una buena analogía.

  • ¡Luego hay otros marcos que van más allá y extienden Express! Zappa , por ejemplo, que integra soporte para CoffeeScript, jQuery del lado del servidor y pruebas.

Aquí hay un ejemplo concreto de lo que se entiende por "middleware": listo para usar, ninguno de los anteriores sirve archivos estáticos para usted. Pero simplemente agregue connect.static(un middleware que viene con Connect), configurado para apuntar a un directorio, y su servidor proporcionará acceso a los archivos en ese directorio. Tenga en cuenta que Express también proporciona los middlewares de Connect; express.statices el mismo que connect.static. (Ambos eran conocidos como staticProviderhasta hace poco).

Mi impresión es que la mayoría de las aplicaciones "reales" de Node.js se están desarrollando con Express en estos días; las características que agrega son extremadamente útiles, y toda la funcionalidad de nivel inferior todavía está allí si lo desea.

Trevor Burnham
fuente
130
Una cosa que me molesta de Connect es que su documentación no parece reconocer que Node es más que un servidor HTTP. "Connect es un marco de middleware para Node.js" - no, "Connect es un marco de middleware para el servidor HTTP de Node.js"
delgado
46
@slim Creo que estás leyendo eso demasiado. Los creadores de Connect son desarrolladores de Nodo preeminentes; son muy conscientes de que Node es más que un servidor HTTP. Pero tiene un servidor HTTP incorporado, y Connect es un marco de middleware que puede usar en su aplicación Node.js.
Trevor Burnham
22
Oh, estoy seguro de que los creadores de Connect son plenamente conscientes de eso. No podrían haber logrado lo que tienen sin una comprensión profunda de Node. Pero la elección de palabras es confusa para los recién llegados a Node; y para los recién llegados a Connect.
delgado
10
claro como el cristal, por lo que todas las respuestas deberían esforzarse. Excelente trabajo Trevor.
Mark Essel
66
Gran explicación Respuestas como esta ayudan a atraer nuevas personas al ecosistema Node.js. Para las personas que se familiarizan con el desarrollo de aplicaciones web en Node.js, Express es el lugar para comenzar. Para continuar con la analogía de Ruby, Express es comparable a Sinatra. Es particularmente genial para crear API JSON para aplicaciones del lado del cliente de Ajax. Una cosa que he encontrado es que una vez que una aplicación alcanza un cierto nivel de complejidad, se necesita otra capa que sea más similar a Rails. Estoy trabajando en Locomotive para este propósito, que se superpone a Express.
Jared Hanson
159

La respuesta aceptada es realmente 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 toma una devolución de llamada (req, res) ej.

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

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

});

server.listen(3000);

Lo que conecta agrega

El middleware es básicamente cualquier software que se encuentra entre el código de su aplicación y alguna API de bajo nivel. Connect amplía la funcionalidad del servidor HTTP incorporado y agrega un marco de plugin. 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 realmente corto! ). Tan pronto como llame var connect = require('connect'); var app = connect();, obtendrá 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 viene 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 httpy no tener que hacer la llamada http.createServer(app). Se llama listeny el código simplemente crea un nuevo servidor http, la conexión del registro como devolución de llamada y reenvía los argumentos 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 bueno http.createServercon un marco de plugin en la parte superior.

Lo que agrega ExpressJS

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

  1. Se puede registrar con createServerlike connect ya que también es solo una función que puede tomar un req/ respar ( 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 más funciones. p.ej

  1. Tiene vista de soporte del motor .
  2. Tiene verbos de nivel superior (get / post, etc.) para su enrutador .
  3. Tiene soporte de configuración de aplicaciones .

El middleware es compartido

La usefunción de ExpressJS y Connect es compatible y, por lo tanto, se comparte el middleware . Ambos son frameworks de middleware, express solo tiene más que un simple framework de middleware .

¿Cual deberías usar?

Mi opinión: usted está suficientemente informado ^ en base a lo anterior ^ para tomar su propia decisión.

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

La mayoría de las personas deberían usar ExpressJS.

¿Qué tiene de malo la respuesta aceptada?

Esto podría haber sido cierto en algún momento, pero ahora está mal:

que hereda una versión extendida de http.Server

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

Express hace lo que Connect hace al módulo http

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

basarat
fuente
usted dice que le da la capacidad de manejar una solicitud y devolver una respuesta, pero la gente dice que Express es realmente el servidor web ... Estoy confundido. ¿El envío de una respuesta no necesitaría la capacidad del servidor web (como Express)?
PositiveGuy
1
buenas cosas, gracias! muy útil ... especialmente sin saber que conectar realmente es lo que proporciona el enrutamiento, y express simplemente hereda eso, no es el único / proveedor de enrutamiento de origen. Y los casos de uso al final son útiles porque supuse que tendría que usar connect AND express, pero realmente todo lo que necesita usar es express para aplicaciones web, así que esto me aclaró una gran cosa. ¡No instala ambos, instala uno u otro!
PositiveGuy
Tu respuesta debería estar en la parte superior. Cuando leí la respuesta aceptada, la voté. Pero después de leer su respuesta ... naahhh
Arun Joshla
67

node.js

Node.js es un motor de JavaScript para el lado del servidor.
Además de todas las capacidades de js, incluye capacidades de red (como HTTP) y acceso al sistema de archivos.
Esto es diferente de js del lado del cliente, donde las tareas de red están monopolizadas por el navegador, y el acceso al sistema de archivos está prohibido por razones de seguridad.

node.js como servidor web: express

Algo que se ejecuta en el servidor, entiende HTTP y puede acceder a los archivos suena como un servidor web. Pero no es uno.
Para hacer que node.js se comporte como un servidor web, uno debe programarlo: manejar las solicitudes HTTP entrantes y proporcionar las respuestas apropiadas.
Esto es lo que hace Express: es la implementación de un servidor web en js.
Por lo tanto, implementar un sitio web es como configurar rutas Express y programar las características específicas del sitio.

Middleware y Connect

Servir páginas implica una serie de tareas. Muchas de esas tareas son bien conocidas y muy comunes, por lo que el módulo Connect del nodo (uno de los muchos módulos disponibles para ejecutarse en el nodo) implementa esas tareas.
Vea la oferta impresionante actual:

  • registrador de solicitudes de registrador con soporte de formato personalizado
  • csrf Protección de falsificación de solicitud entre sitios
  • comprimir el middleware de compresión Gzip
  • basicAuth autenticación básica http
  • bodyParser extensor de solicitud cuerpo analizador
  • aplicación json / analizador json
  • aplicación urlencoded / x-www-form-urlencoded parser
  • multipart multipart / form-data parser
  • tiempo de espera de solicitud
  • cookieParser analizador de cookies
  • sesión soporte de gestión de sesión con MemoryStore incluido
  • cookieSession soporte de sesión basado en cookies
  • Método: anular la compatibilidad con el método HTTP falso
  • responseTime calcula el tiempo de respuesta y expone a través de X-Response-Time
  • capa de memoria caché staticCache para el middleware static ()
  • servidor de archivos estáticos de transmisión estática que admite Range y más
  • directorio directorio listado middleware
  • vhost middleware de mapeo de subdominio de host virtual
  • servidor favicon eficiente de favicon (con icono predeterminado)
  • limit limit el bytesize de los cuerpos de solicitud
  • consulta analizador automático de cadenas de consulta, rellenando req.query
  • errorHandler controlador de errores flexible

Connect es el marco y a través de él puedes elegir los (sub) módulos que necesitas.
La página de Middleware de Contrib enumera una larga lista de middlewares adicionales .
Express en sí viene con los middlewares Connect más comunes.

¿Qué hacer?

Instalar node.js.
El nodo viene con npm , el administrador de paquetes de nodos .
El comando npm install -g expressdescargará e instalará express globalmente (consulte la guía express ).
La ejecución express fooen una línea de comando (no en el nodo) creará una aplicación lista para ejecutar llamada foo. Cambie a su directorio (recién creado) y ejecútelo con el nodo con el comando node <appname>, luego ábralo http://localhost:3000y vea. Ahora estas dentro.

Juan Lanus
fuente
3
gran respuesta gracias. Este es el tipo de basura simple que se pierde cada publicación de blog, la configuración simple que puede ser si nunca lo has hecho antes. ¡Sí, es simple cuando ya lo ha hecho, pero no tiene idea de cómo comenzar por PRIMERA vez! Odio cuando los desarrolladores pasan por alto que en las publicaciones de blog, es esencial. No quiero tener que ENCONTRAR otra publicación de blog solo para encontrar la configuración. Solo proporcione un enlace a otra publicación de blog en sus otras publicaciones, eso es extremadamente útil para que no tenga que buscar una. ¡Sálvame el viaje de caza!
PositiveGuy
3
Express 4.0.0 necesita hacer sudo npm install -g express-generator
mohamed-ibrahim
@getsetbro solo quiere decir 'npm install' para instalar las dependencias.
Torsten Barthel
16

Connect ofrece un API de "nivel superior" para la funcionalidad común del servidor HTTP, como la administración de sesiones, autenticación, registro y más. Express está construido sobre Connect con funcionalidad avanzada (como Sinatra).

yojimbo87
fuente
0

Node.jsofrece un módulo HTTP, cuyo método createServer devuelve un objeto que puede usar para responder a las solicitudes HTTP. Ese objeto hereda el http.Serverprototipo.

Suraj Kumar Yadav
fuente
0

Información relacionada, especialmente si está utilizando NTVS para trabajar con el IDE de Visual Studio. El NTVS agrega herramientas NodeJS y Express, andamios, plantillas de proyectos a Visual Studio 2012, 2013.

Además, el lenguaje que llama a ExpressJS o Connect como "WebServer" es incorrecto. Puede crear un servidor web básico con o sin ellos. Un programa básico de NodeJS también puede usar el módulo http para manejar solicitudes http, convirtiéndose así en un servidor web rudimentario.

Vic
fuente
0

middleware como su nombre indica en realidad middleware es sentarse entre medio .. medio de qué? en medio de la solicitud y la respuesta ... cómo la solicitud, la respuesta, el servidor express se sientan en la aplicación express en esta imagen, puede ver que las solicitudes provienen del cliente y luego el servidor del servidor express atiende esas solicitudes ... luego profundicemos ... en realidad podemos dividir esto toda la tarea del servidor express en tareas separadas pequeñas como de esta manera. cómo el middleware se ubica entre la solicitud y la respuesta, una pequeña parte de las partes del servidor que realizan una tarea en particular y pasan la solicitud a la siguiente ... finalmente, se realiza la respuesta de todas las tareas. ciclo de respuesta ..

este es un buen ejemplo para explicar el middleware en video express de youtube para middleware

Hasanga Lakdinu
fuente
-7

La estúpida respuesta simple

Connect y Express son servidores web para nodejs. A diferencia de Apache e IIS, ambos pueden usar los mismos módulos, denominados "middleware".

kmiles
fuente