Express.js - app.listen vs. server.listen

439

To może być bardzo podstawowe pytanie, ale po prostu nie rozumiem. Jaka jest różnica między tworzeniem aplikacji za pomocą Express.js a uruchamianiem aplikacji nasłuchującej na porcie 1234, na przykład:

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

//app.configure, app.use etc

app.listen(1234);

i dodanie serwera 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);

Co za różnica?
Jeśli przejdę do http://localhost:1234, otrzymam to samo wyjście.

Tamas
źródło
25
Zastanawiam się nad tym od jakiegoś czasu ... Dobre pytanie!
Stijn de Witt
2
Zdaję sobie sprawę, że to pytanie jest stare, ale chcę zauważyć, że createServer został zdeprecjonowany.
Philip Kirkbride,
@ PhilipKirkbride czy możesz przedstawić dowód?
yanot,
12
@PhilipKirkbride Uważam, że jest to nieco mylące stwierdzenie. Metoda createServer () ExpressJS została uznana za przestarzałą, ale moduł HTTP Node.js nadal używa metody createServer () i nie jest przestarzała.
Tamas,

Odpowiedzi:

562

Drugi formularz (samodzielne tworzenie serwera HTTP zamiast tworzenia go przez Express) jest przydatny, jeśli chcesz ponownie użyć serwera HTTP, na przykład w celu uruchomienia socket.iow tej samej instancji serwera HTTP:

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

app.listen()Zwraca jednak również instancję serwera HTTP, więc przy odrobinie przepisywania możesz osiągnąć coś podobnego bez samodzielnego tworzenia serwera 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) {
  ...
});
robertklep
źródło
2
więc wymagają („http”). createServer (wymagają („express”)). Listen (80) jest === wymaga („express”) ().
Listen
7
@ user2167582 efekt jest taki sam, tak, ale oczywiście dosłowne ===porównanie się nie powiedzie;) Jeśli mi nie wierzysz, zawsze jest źródło .
robertklep,
1
czy var socketio = require('socket.io')w twoim przepisaniu jest potrzebny trzeci wiersz?
davidx1
1
za i przeciw każdego z nich?
Tanner Summers
2
@TannerSummers Praktycznie zawsze używam, app.listen()ponieważ wymaga mniej kodu. Ponieważ jest to tylko bardzo cienka warstwa server.listen()i zwraca instancję serwera, generalnie nie ma powodu, aby ręcznie tworzyć osobną instancję serwera HTTP.
robertklep
64

Jest jeszcze jedna różnica w korzystaniu z aplikacji i słuchaniu serwera HTTP, gdy chcesz skonfigurować serwer https

Aby skonfigurować protokół https, potrzebujesz kodu poniżej:

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

Aplikacja z ekspresu zwróci tylko serwer HTTP, nie możesz ustawić go w trybie ekspresowym, więc musisz użyć polecenia serwera https

var express = require('express');
var app = express();
app.listen(1234);
Tim
źródło
30

Tylko w celu punktualności i przedłużenia trochę odpowiedzi Tima.
Z oficjalnej dokumentacji :

Aplikacja zwrócona przez express () jest w rzeczywistości funkcją JavaScript, ZAPROJEKTOWANĄ DO PRZEKAZYWANIA na serwerach HTTP Node jako wywołanie zwrotne do obsługi żądań.

Ułatwia to dostarczenie wersji aplikacji HTTP i HTTPS z tą samą bazą kodu, ponieważ aplikacja nie dziedziczy po nich (jest to po prostu wywołanie zwrotne):

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

Metoda app.listen () zwraca obiekt http.Server, a (dla HTTP) jest wygodną metodą dla następujących elementów:

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Ivan Talalaev
źródło
1
Wyjaśnij nieco więcej na temat drugiego fragmentu kodu. Co dokładnie masz na myśli mówiąc o wygodnej metodzie tutaj?
Aakash Verma
@AakashVerma to tylko fragment kodu źródłowego exress, który można znaleźć express/lib/appplication.jsi nic więcej niż skrót do utworzenia serwera HTTP węzła.
Ivan Talalaev
Chcesz powiedzieć, że kiedy używamy aplikacji express () jako wywołania zwrotnego, odbiera ona żądanie z zewnętrznego serwera HTTP (za pośrednictwem 80 lub 443), a następnie tworzy w sobie inny serwer wirtualny http.Server i używa go do nasłuchiwania do przesłanych do niego wniosków?
Aakash Verma
10

Przyszedłem z tym samym pytaniem, ale po Google znalazłem, że nie ma dużej różnicy :)

Z Github

Jeśli chcesz utworzyć zarówno serwer HTTP, jak i HTTPS, możesz to zrobić za pomocą modułów „http” i „https”, jak pokazano tutaj.

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

Także jeśli chcesz pracować z socket.io, zobacz ich przykład

Zobacz to

Wolę app.listen():)

Muhammad Shahzad
źródło
9

Express to po prostu opakowanie modułu http, który został stworzony dla ułatwienia programistom w taki sposób, że ..

  1. Mogą skonfigurować oprogramowanie pośrednie, aby odpowiadało na żądania HTTP (łatwo) za pomocą ekspresowego.
  2. Mogą dynamicznie renderować strony HTML na podstawie przekazywania argumentów do szablonów za pomocą ekspresu.
  3. Mogą również łatwo definiować routing za pomocą ekspresu.
Sarim Javaid Khan
źródło