Express.js – app.listen vs server.listen

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 e iniciar la aplicación escuchando 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 a http://localhost:1234 , obtengo el mismo resultado.

El segundo formulario (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.io dentro 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) { ... }); 

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 configurarlo en modo expreso, por lo que deberá usar el comando https server

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

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 una callback para manejar las solicitudes.

Esto hace que sea más fácil proporcionar 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 callback):

 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); }; 

Express es básicamente una envoltura del 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 representar dinámicamente páginas HTML basadas en pasar argumentos a plantillas usando Express.
  3. También pueden definir el enrutamiento fácilmente usando Express.

Vine con la misma pregunta, pero después de google, descubrí que no hay 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 quieres trabajar con socket.io, mira su ejemplo

Mira esto

Prefiero app.listen() 🙂