Express.js - app.listen vs server.listen

439

Esta puede ser una pregunta muy básica, pero simplemente no la entiendo. ¿Cuál es la diferencia entre crear una aplicación usando Express.js y comenzar a escuchar la aplicación en el puerto 1234, por ejemplo:

var express = require('express');
var app = express();

//app.configure, app.use etc

app.listen(1234);

y agregando un servidor http:

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

¿Cual es la diferencia?
Si navego hasta http://localhost:1234, obtengo el mismo resultado.

Tamas
fuente
25
Me he estado preguntando esto por algún tiempo ... ¡Buena pregunta!
Stijn de Witt
2
Me doy cuenta de que esta pregunta es antigua, pero quiero señalar que createServer se ha depreciado.
Philip Kirkbride
@PhilipKirkbride ¿Puede usted, por favor, proporcionar pruebas?
yanot
12
@PhilipKirkbride Creo que es una declaración algo engañosa. El método createServer () de ExpressJS ha quedado en desuso, pero el módulo HTTP Node.js todavía usa createServer () y eso no está en desuso.
Tamas

Respuestas:

563

La segunda forma (crear un servidor HTTP usted mismo, en lugar de hacer que Express cree uno para usted) es útil si desea reutilizar el servidor HTTP, por ejemplo, para ejecutar socket.iodentro de la misma instancia del servidor HTTP:

var express = require('express');
var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);
...
server.listen(1234);

Sin embargo, app.listen()también devuelve la instancia del servidor HTTP, por lo que con un poco de reescritura puede lograr algo similar sin crear un servidor HTTP usted mismo:

var express   = require('express');
var app       = express();

// app.use/routes/etc...

var server    = app.listen(3033);
var io        = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
  ...
});
robertklep
fuente
2
así que require ('http "). createServer (require (" express ")). listen (80) es === require (" express ") (). listen (80)?
user2167582
77
@ user2167582 el efecto es el mismo, sí, pero, por supuesto, una ===comparación literal fallaría;) Si no me crees, siempre existe la fuente .
robertklep
1
¿Está var socketio = require('socket.io')en la tercera línea necesaria en su reescritura?
davidx1
1
a favor y en contra de cada uno?
Tanner Summers
2
@TannerSummers Prácticamente siempre uso app.listen()porque requiere menos código. Como solo es una capa muy delgada server.listen()y devuelve la instancia del servidor, generalmente no hay razón para crear una instancia de servidor HTTP por separado de forma manual.
robertklep
64

Hay una diferencia más de usar la aplicación y escuchar el servidor http es cuando desea configurar el servidor https

Para configurar https, necesita el siguiente código:

var https = require('https');
var server = https.createServer(app).listen(config.port, function() {
    console.log('Https App started');
});

La aplicación de express solo devolverá el servidor http, no puede configurarla en express, por lo que deberá usar el comando https server

var express = require('express');
var app = express();
app.listen(1234);
Tim
fuente
30

Solo por puntualidad y extender un poco la respuesta de Tim.
De la documentación oficial :

La aplicación devuelta por express () es de hecho una función de JavaScript, DISEÑADA PARA PASARSE a los servidores HTTP de Node como devolución de llamada para manejar solicitudes.

Esto facilita proporcionar las versiones HTTP y HTTPS de su aplicación con la misma base de código, ya que la aplicación no hereda de estas (es simplemente una devolución de llamada):

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

El método app.listen () devuelve un objeto http.Server y (para HTTP) es un método conveniente para lo siguiente:

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Ivan Talalaev
fuente
1
Explique un poco más sobre el segundo código. ¿Qué quiere decir exactamente con un método conveniente aquí?
Aakash Verma
@AakashVerma, esto es solo una parte del código fuente de Exress que se puede encontrar express/lib/appplication.jsy nada más que un atajo para crear el servidor http del nodo.
Ivan Talalaev
Entonces, quiere decir que cuando usamos la aplicación express () como devolución de llamada, recibe la solicitud del servidor HTTP externo (a través de 80 o 443) y luego crea otro servidor virtual http.Server dentro de sí mismo y lo usa para escuchar a las solicitudes enviadas a él?
Aakash Verma
10

Vine con la misma pregunta pero después de google, descubrí que no hay una gran diferencia :)

De Github

Si desea crear un servidor HTTP y HTTPS, puede hacerlo con los módulos "http" y "https" como se muestra aquí.

/**
 * Listen for connections.
 *
 * A node `http.Server` is returned, with this
 * application (which is a `Function`) as its
 * callback. If you wish to create both an HTTP
 * and HTTPS server you may do so with the "http"
 * and "https" modules as shown here:
 *
 *    var http = require('http')
 *      , https = require('https')
 *      , express = require('express')
 *      , app = express();
 *
 *    http.createServer(app).listen(80);
 *    https.createServer({ ... }, app).listen(443);
 *
 * @return {http.Server}
 * @api public
 */

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

Además, si desea trabajar con socket.io, vea su ejemplo

Ver esto

Yo prefiero app.listen():)

Muhammad Shahzad
fuente
9

Express es básicamente un contenedor de módulo http que se crea para la facilidad de los desarrolladores de tal manera que ...

  1. Pueden configurar middlewares para responder a solicitudes HTTP (fácilmente) usando express.
  2. Pueden renderizar dinámicamente páginas HTML basadas en pasar argumentos a plantillas usando express.
  3. También pueden definir el enrutamiento fácilmente utilizando express.
Sarim Javaid Khan
fuente