web-dev-qa-db-fra.com

Express.js - app.listen vs server.listen

C'est peut-être une question très fondamentale, mais je ne comprends tout simplement pas. Quelle est la différence entre la création d'une application à l'aide de Express.js et le démarrage de l'application à l'écoute sur le port 1234, par exemple:

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

//app.configure, app.use etc

app.listen(1234);

et en ajoutant un serveur 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);

Quelle est la différence?
Si je navigue vers http://localhost:1234, le même résultat sera ainsi obtenu.

363
Tamas

Le second formulaire (créer vous-même un serveur HTTP au lieu d’Express en créer un) est utile si vous souhaitez réutiliser le serveur HTTP, par exemple pour exécuter socket.io au sein de la même instance de serveur HTTP:

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

Cependant, app.listen() renvoie également l'instance de serveur HTTP. Ainsi, avec un peu de réécriture, vous pouvez obtenir quelque chose de similaire sans créer vous-même un serveur HTTP:

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) {
  ...
});
490
robertklep

Il y a une autre différence entre l'utilisation de l'application et l'écoute du serveur http, c'est lorsque vous souhaitez configurer le serveur https.

Pour configurer https, vous avez besoin du code ci-dessous:

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

L'application d'Express ne renvoie que le serveur HTTP. Vous ne pouvez pas la définir dans Express. Vous devez donc utiliser la commande https server.

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

Juste pour but de ponctualité et étendre un peu la réponse de Tim.
De documentation officielle :

L’application renvoyée par express () est en fait une fonction JavaScript, CONÇU POUR ÊTRE PASSÉ aux serveurs HTTP du nœud en tant que rappel pour traiter les demandes.

Cela facilite la fourniture de la même base de code aux versions HTTP et HTTPS de votre application, car l'application n'en hérite pas (il s'agit simplement d'un rappel):

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

La méthode app.listen () renvoie un objet http.Server et (pour HTTP) est un méthode de commodité pour les éléments suivants:

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

Express est fondamentalement un wrapper de module http qui est créé pour la facilité des développeurs de telle sorte que ..

  1. Ils peuvent configurer des middlewares pour répondre (facilement) aux requêtes HTTP en utilisant express.
  2. Ils peuvent effectuer un rendu dynamique des pages HTML en passant des arguments à des modèles à l'aide de la commande express.
  3. Ils peuvent également définir facilement le routage en utilisant express.
6
Sarim Javaid Khan

Je suis venu avec la même question mais après Google, j'ai trouvé qu'il n'y avait pas de grande différence :)

De Github

Si vous souhaitez créer un serveur HTTP et HTTPS, vous pouvez le faire avec les modules "http" et "https" comme indiqué ici.

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

Aussi, si vous voulez travailler avec socket.io, voyez leur exemple

Voir this

Je préfère app.listen() :)

5
Muhammad Shahzad