Express.js - app.listen vs server.listen

439

Dies mag eine sehr grundlegende Frage sein, aber ich verstehe sie einfach nicht. Was ist der Unterschied zwischen dem Erstellen einer App mit Express.js und dem Starten der App, die Port 1234 überwacht ? Beispiel:

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

//app.configure, app.use etc

app.listen(1234);

und Hinzufügen eines http-Servers:

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

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

//app.configure, app.use etc

server.listen(1234);

Was ist der Unterschied?
Wenn ich zu navigiere http://localhost:1234, erhalte ich die gleiche Ausgabe.

Tamas
quelle
25
Ich habe mich das schon seit einiger Zeit gefragt ... Gute Frage!
Stijn de Witt
2
Mir ist klar, dass diese Frage alt ist, aber ich möchte darauf hinweisen, dass createServer abgeschrieben wurde.
Philip Kirkbride
@PhilipKirkbride können Sie bitte einen Beweis erbringen?
Yanot
12
@PhilipKirkbride Ich glaube, das ist eine etwas irreführende Aussage. Die Methode createServer () von ExpressJS ist veraltet, aber das HTTP-Modul Node.js verwendet weiterhin createServer (), und das ist nicht veraltet.
Tamas

Antworten:

562

Das zweite Formular (Erstellen eines HTTP-Servers selbst, anstatt dass Express einen für Sie erstellt) ist nützlich, wenn Sie den HTTP-Server wiederverwenden möchten, z. B. um ihn socket.ioin derselben HTTP-Serverinstanz auszuführen :

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

Gibt jedoch app.listen()auch die HTTP-Serverinstanz zurück, sodass Sie mit ein wenig Umschreiben etwas Ähnliches erreichen können, ohne selbst einen HTTP-Server zu erstellen:

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
quelle
2
also erfordern ('http "). createServer (erfordern (" express ")). listen (80) ist === erfordern (" express ") (). listen (80)?
user2167582
7
@ user2167582 der Effekt ist der gleiche, ja, aber natürlich würde ein wörtlicher ===Vergleich fehlschlagen;) Wenn du mir nicht glaubst, gibt es immer die Quelle .
Robertklep
1
ist var socketio = require('socket.io')in der dritten Zeile in Ihrem Umschreiben notwendig?
Davidx1
1
Vor- und Nachteile von jedem?
Tanner Summers
2
@TannerSummers Ich benutze praktisch immer, app.listen()weil es weniger Code erfordert. Da es sich nur um eine sehr dünne Schicht server.listen()handelt und die Serverinstanz zurückgegeben wird, gibt es im Allgemeinen keinen Grund, manuell eine separate HTTP-Serverinstanz zu erstellen.
Robertklep
64

Es gibt noch einen weiteren Unterschied zwischen der Verwendung der App und dem Abhören des http-Servers, wenn Sie den https-Server einrichten möchten

Zum Einrichten von https benötigen Sie den folgenden Code:

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

Die App von Express gibt nur den http-Server zurück. Sie können sie nicht in Express festlegen. Daher müssen Sie den Befehl https server verwenden

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

Nur aus Pünktlichkeitsgründen und ein bisschen verlängern Tim Antwort.
Aus der offiziellen Dokumentation :

Die von express () zurückgegebene App ist in der Tat eine JavaScript-Funktion, die für die Weitergabe vorgesehen ist auf Server Knoten HTTP als Callback Griff Anfragen.

Dies macht es einfach, sowohl HTTP- als auch HTTPS-Versionen Ihrer App mit derselben Codebasis bereitzustellen, da die App diese nicht erbt (es handelt sich lediglich um einen Rückruf):

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

Die Methode app.listen () gibt ein http.Server- Objekt zurück und (für HTTP) ist eine praktische Methode für Folgendes:

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Ivan Talalaev
quelle
1
Bitte erläutern Sie etwas mehr zum zweiten Teil des Codes. Was genau meinen Sie hier mit einer praktischen Methode?
Aakash Verma
@AakashVerma Dies ist nur ein Teil des Quellcodes von exress, der in express/lib/appplication.jsund nichts weiter als eine Verknüpfung zum Erstellen des http-Servers des Knotens enthalten ist.
Ivan Talalaev
Sie wollen also sagen, dass wenn wir die App von express () als Rückruf verwenden, sie die Anfrage vom äußeren HTTP-Server (entweder über 80 oder 443) empfängt und dann einen anderen virtuellen Server http.Server in sich selbst erstellt und zum Abhören verwendet zu den an sie weitergeleiteten Anfragen?
Aakash Verma
10

Ich kam mit der gleichen Frage, aber nach Google stellte ich fest, dass es keinen großen Unterschied gibt :)

Von Github

Wenn Sie sowohl einen HTTP- als auch einen HTTPS-Server erstellen möchten, können Sie dies mit den hier gezeigten Modulen "http" und "https" tun.

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

Auch wenn Sie mit socket.io arbeiten möchten, sehen Sie sich das Beispiel an

Sehen Sie das

Ich bevorzuge app.listen():)

Muhammad Shahzad
quelle
9

Express ist im Grunde ein Wrapper des http-Moduls, der für die Entwickler so erstellt wurde, dass ..

  1. Sie können Middlewares einrichten, um (einfach) mit Express auf HTTP-Anfragen zu antworten.
  2. Sie können HTML-Seiten dynamisch rendern, indem sie Argumente mit Express an Vorlagen übergeben.
  3. Sie können das Routing auch einfach mit Express definieren.
Sarim Javaid Khan
quelle