655 Stimmen

Express.js - app.listen vs server.listen

Dies mag eine sehr grundlegende Frage sein, aber ich verstehe es einfach nicht. Was ist der Unterschied zwischen der Erstellung einer App mit Express.js und dem Starten der App, die auf Port 1234 lauscht, zum Beispiel:

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

//app.configure, app.use etc

app.listen(1234);

und dem 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 http://localhost:1234 navigiere, erhalte ich den gleichen Output.

774voto

robertklep Punkte 195047

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 socket.io innerhalb derselben HTTP-Server-Instanz 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);

Allerdings gibt app.listen() auch die HTTP-Server-Instanz zurück, sodass Sie mit etwas Umschreiben etwas Ähnliches erreichen können, ohne einen HTTP-Server selbst 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) {
  ...
});

86voto

Tim Punkte 3585

Es gibt noch einen Unterschied bei der Verwendung der App und dem Hören auf den HTTP-Server, wenn Sie den Server für HTTPS einrichten möchten

Um HTTPS einzurichten, 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 liefert nur den HTTP-Server zurück, den Sie nicht in Express einstellen können. Sie müssen also den Befehl für den HTTPS-Server verwenden

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

67voto

Ivan Talalaev Punkte 5312

Nur zu punctuality Zweck und erweitern Sie ein wenig Tim' s Antwort.
Aus offizieller Dokumentation:

Die von express() zurückgegebene App ist tatsächlich eine JavaScript-Funktion, ENTWICKELT, UM ALS CALLBACK an Node’s HTTP-Server übergeben zu werden, um Anfragen zu verarbeiten.

Dies ermöglicht es, sowohl HTTP- als auch HTTPS-Versionen Ihrer App mit dem gleichen Codebasis bereitzustellen, da die App nicht aus diesen erbt (es ist einfach ein Callback):

var https =require('https');
var http = require('http');
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

Die app.listen() Methode gibt ein http.Server Objekt zurück und (für HTTP) ist eine Bequemlichkeitsmethode für das Folgende:

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

17voto

Muhammad Shahzad Punkte 8494

Ich kam mit der gleichen Frage, aber nachdem ich gegoogelt hatte, fand ich heraus, 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 Modulen "http" und "https" tun, wie hier gezeigt.

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

Wenn Sie auch mit socket.io arbeiten möchten, sehen Sie sich ihr Beispiel

Sehen Sie dies

Ich bevorzuge app.listen() :)

13voto

Sarim Javaid Khan Punkte 780

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

  1. Sie mittels Express leicht Middlewares einrichten können, um auf HTTP-Anfragen zu reagieren.
  2. Sie mittels Express HTML-Seiten dynamisch rendern können, basierend auf übergebenen Argumenten an Vorlagen.
  3. Sie mittels Express auch problemlos Routen definieren können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X