Express.js - app.listen vs server.listen

439

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

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

//app.configure, app.use etc

app.listen(1234);

et ajouter 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, j'obtiens donc la même sortie.

Tamas
la source
25
Je me le demande depuis un certain temps ... Bonne question!
Stijn de Witt
2
Je me rends compte que cette question est ancienne mais je tiens à noter que createServer a été déprécié.
Philip Kirkbride
@PhilipKirkbride pouvez-vous, s'il vous plaît, fournir une preuve?
yanot
12
@PhilipKirkbride Je pense que c'est une déclaration quelque peu trompeuse. La méthode createServer () d'ExpressJS est obsolète, mais le module HTTP Node.js utilise toujours createServer () et ce n'est pas obsolète.
Tamas

Réponses:

563

Le deuxième formulaire (création d'un serveur HTTP vous-même, au lieu de demander à Express d'en créer un pour vous) est utile si vous souhaitez réutiliser le serveur HTTP, par exemple pour l'exécuter socket.iodans 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, donc avec un peu de réécriture, vous pouvez obtenir quelque chose de similaire sans créer de serveur HTTP vous-même:

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
la source
2
donc require ('http "). createServer (require (" express ")). listen (80) is === require (" express ") (). listen (80)?
user2167582
7
@ user2167582 l'effet est le même, oui, mais bien sûr une ===comparaison littérale échouerait;) Si vous ne me croyez pas, il y a toujours la source .
robertklep
1
est var socketio = require('socket.io')sur la troisième ligne nécessaire dans votre réécriture?
davidx1
1
pour et contre de chacun?
Tanner Summers
2
@TannerSummers J'utilise pratiquement toujours app.listen()car il nécessite moins de code. Étant donné qu'il ne s'agit que d'une couche très mince au-dessus server.listen()et qu'il renvoie l'instance de serveur, il n'y a généralement aucune raison de créer manuellement une instance de serveur HTTP distincte.
robertklep
64

Il y a une autre différence entre l'utilisation de l'application et l'écoute du serveur http 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 renverra uniquement le serveur http, vous ne pouvez pas le définir dans express, vous devrez donc utiliser la commande https server

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

Juste à des fins de ponctualité et étendre un peu la réponse de Tim.
De la documentation officielle :

L'application renvoyée par express () est en fait une fonction JavaScript, CONÇUE POUR ÊTRE PASSÉE aux serveurs HTTP de Node en tant que rappel pour gérer les demandes.

Cela permet de fournir facilement les versions HTTP et HTTPS de votre application avec la même base de code, 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 une méthode pratique pour les éléments suivants:

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Ivan Talalaev
la source
1
Veuillez expliquer un peu plus sur le deuxième morceau de code.Que voulez-vous dire exactement par une méthode pratique ici?
Aakash Verma
@AakashVerma c'est juste un morceau du code source d'exress qui peut être trouvé dans express/lib/appplication.jset rien de plus qu'un raccourci pour créer le serveur http du nœud.
Ivan Talalaev
Donc, vous voulez dire que lorsque nous utilisons app par express () comme rappel, il reçoit la demande du serveur HTTP externe (via 80 ou 443) puis crée un autre serveur virtuel http.Server en lui-même et l'utilise pour écouter aux demandes qui lui sont transmises?
Aakash Verma
10

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 :)

Depuis 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 voir leur exemple

Voir ça

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

Muhammad Shahzad
la source
9

Express est essentiellement un wrapper de module http qui est créé pour la facilité des développeurs de telle manière que ..

  1. Ils peuvent configurer des middlewares pour répondre (facilement) aux requêtes HTTP en utilisant express.
  2. Ils peuvent afficher dynamiquement des pages HTML en fonction du passage d'arguments aux modèles à l'aide d'express.
  3. Ils peuvent également définir facilement le routage en utilisant express.
Sarim Javaid Khan
la source