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


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


597
2018-03-12 17:59


origen


Respuestas:


[Actualizar: 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. Esta es mi mejor oportunidad para explicarlo:

  • Node.js mismo ofrece una http módulo, cuyo createServer método devuelve un objeto que puede usar para responder a solicitudes HTTP. Ese objeto hereda el http.Server prototipo.

  • Conectar también ofrece un createServer método, que devuelve un objeto que hereda una versión extendida de http.Server. Las extensiones de Connect están principalmente ahí para que sea más fácil conectarse middleware. Es por eso que Connect se describe a sí mismo como un "marco de middleware", y a menudo se lo compara con el Rack de Ruby.

  • Exprimir hace para conectar lo que hace Connect al módulo http: ofrece un createServer método que extiende Connect's Server prototipo. Entonces, toda la funcionalidad de Connect está ahí, más ver renderizado y una práctica DSL para describir rutas. La 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 significa "middleware": de manera predeterminada, ninguno de los anteriores sirve archivos estáticos para usted. Pero solo echa adentro 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 middleware 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 "reales" de Node.js se están desarrollando con Express en la actualidad; las características que agrega son extremadamente útiles, y todas las funcionalidades de nivel inferior todavía están allí si lo desea.


856
2018-03-13 15:28



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

Lo que viene Node.js

http / https  createServer que simplemente toma una devolución de llamada (req, res) p.

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

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

});

server.listen(3000);

Lo que conecta agrega

Middleware es básicamente cualquier software que se ubica entre el código de tu aplicación y un API de bajo nivel. Connect amplía la funcionalidad incorporada del servidor HTTP y agrega un marco de plugins. 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();obtienes una función app eso puede:

  1. Puede manejar una solicitud y devolver una respuesta. Esto es porque básicamente obtienes esta función
  2. Tiene una función miembro .use (fuente) administrar complementos (eso viene de aquí porque esta simple línea de código)

Debido a 1.) puede hacer lo siguiente:

var app = connect();

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

Combine con 2.) y obtendrá:

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 con http para que no tenga que hacer la llamada a http.createServer(app). Se llama listen y el código simplemente crea un nuevo servidor http, se conecta como la 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');

Todavía eres tu bueno viejo http.createServer con un marco de plugin en la parte superior.

Lo que ExpressJS agrega

ExpressJS y connect son proyectos paralelos. Connect es sólo un framework de middleware, con un buen use función. Express no depende de Connect (ver paquete.json) Sin embargo, hace todo lo que conecta, es decir:

  1. Puede ser registrado con createServer como conectar ya que también es solo una función que puede tomar una req/res par (fuente)
  2. UN usar la función para registrar middleware.
  3. Una utilidad listen funcionar para registrarse en http

Además de lo que proporciona connect (que expresa duplicados), tiene un montón de características adicionales. p.ej.

  1. Tiene ver el soporte del motor.
  2. Tiene nivel superior verbos (get / post, etc.) para su enrutador.
  3. Tiene Configuraciones de la aplicación apoyo.

El middleware es compartido

los use función de ExpressJS y conectar es compatible y por lo tanto el middleware es compartido. Ambos son frameworks de middleware, express solo tiene más de un marco de middleware simple.

¿Cual deberías usar?

Mi opinión: está lo suficientemente informado ^ basado en lo anterior ^ para hacer su propia elección.

  • Utilizar http.createServer si está creando algo como connect / expressjs desde cero.
  • Use connect si está creando middleware, protocolos de prueba, etc. ya que es una buena abstracción en la parte superior de http.createServer
  • Use ExpressJS si está creando sitios web.

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

¿Qué pasa con 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

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

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

Express 4.0 ni siquiera depende de connect. ver la sección actual de dependencias package.json


137
2018-05-30 15:14



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 archivos, suena como un servidor web. Pero no es uno.
Para hacer que node.js se comporte como un servidor web, uno tiene que programarlo: manejar las solicitudes HTTP entrantes y proporcionar las respuestas apropiadas.
Esto es lo que Express hace: 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 Conectar El módulo (uno de los muchos módulos disponibles para ejecutarse bajo el nodo) implementa esas tareas.
Vea la oferta impresa actual:

  • registrador           registrador de solicitud con soporte de formato personalizado
  • csrf             Solicitud de protección contra falsificación entre sitios
  • comprimir         Middleware de compresión Gzip
  • basicAuth        autenticación http básica
  • bodyParser       analizador de cuerpo de solicitud extensible
  • json             parser de aplicación / json
  • urlencoded       application / x-www-form-urlencoded parser
  • multiparte        multipart / form-data parser
  • se acabó el tiempo          solicitar tiempos de espera
  • cookieParser     analizador de cookies
  • sesión          soporte de gestión de sesiones con MemoryStore incluido
  • cookieSession    soporte de sesión basado en cookies
  • methodOverride   falso soporte de método HTTP
  • tiempo de respuesta     calcula el tiempo de respuesta y expone a través de X-Response-Time
  • staticCache      capa de memoria caché para el middleware estático ()
  • estático           streaming de servidor de archivos estáticos que admite Range y más
  • directorio        directorio listado middleware
  • vhost            middleware de mapeo de subdominio de host virtual
  • Favicon          servidor favicon eficiente (con el icono predeterminado)
  • límite            limitar el tamaño de bytes de los cuerpos de solicitud
  • consulta            analizador de querystring automático, rellenando consulta obligatoria
  • errorHandler     manejador de error flexible

Connect es el marco y, a través de él, puede elegir los (sub) módulos que necesita.
los Contrib Middleware La página enumera una larga lista de middlewares.
Express 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 express descargará e instalará expreso globalmente (verifique guía express)
Corriendo express foo en una línea de comandos (no en el nodo) creará una aplicación lista para ejecutar llamada foo. Cambie a su directorio (recién creado) y ejecútelo con un nodo con el comando node <appname>, luego abre http://localhost:3000 y ver. Ahora estás adentro.


63
2018-05-25 19:26



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


15
2018-03-12 19:34



Node.js ofrece un módulo HTTP, cuyo createServer método devuelve un objeto que puede usar para responder a solicitudes HTTP. Ese objeto hereda el http.Server prototipo.


0
2017-09-12 11:27



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

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


-1
2018-04-24 11:25



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, a los que se hace referencia como "middleware".


-7
2018-03-04 22:00