Express.js - app.listen vs server.listen


439

Questa potrebbe essere una domanda molto semplice, ma semplicemente non capisco. Qual è la differenza tra la creazione di un'app utilizzando Express.js e l'avvio dell'app in ascolto sulla porta 1234, ad esempio:

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

//app.configure, app.use etc

app.listen(1234);

e aggiungendo un server 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);

Qual è la differenza?
Se navigo verso http://localhost:1234, ottengo quindi lo stesso output.


25
Me lo stavo chiedendo da tempo ... Buona domanda!
Stijn de Witt,

2
Mi rendo conto che questa domanda è vecchia ma voglio notare, createServer è stato deprezzato.
Philip Kirkbride,

@PhilipKirkbride Puoi, per favore, fornire prove?
yanot

12
@PhilipKirkbride Credo che sia una dichiarazione un po 'fuorviante. Il metodo createServer () di ExpressJS è stato deprecato, ma il modulo HTTP Node.js utilizza ancora createServer () e non è deprecato.
Tamas,

Risposte:


563

Il secondo modulo (creazione di un server HTTP da soli, invece di avere Express per crearne uno per te) è utile se si desidera riutilizzare il server HTTP, ad esempio per eseguire socket.ioall'interno della stessa istanza del server HTTP:

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

Tuttavia, app.listen()restituisce anche l'istanza del server HTTP, quindi con un po 'di riscrittura puoi ottenere qualcosa di simile senza creare tu stesso un server 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) {
  ...
});

2
quindi require ('http "). createServer (request (" express ")). hear (80) is === require (" express ") ().
hear

7
@ user2167582 l'effetto è lo stesso, sì, ma ovviamente un ===confronto letterale fallirebbe;) Se non mi credi, c'è sempre la fonte .
robertklep,

1
è var socketio = require('socket.io')la terza riga necessaria nella tua riscrittura?
davidx1,

1
pro e contro di ciascuno?
Tanner Summers,

2
@TannerSummers Uso praticamente sempre app.listen()perché richiede meno codice. Poiché è solo uno strato molto sottile server.listen()e restituisce l'istanza del server, generalmente non c'è motivo di creare manualmente un'istanza del server HTTP separata.
robertklep,

64

C'è un'altra differenza nell'uso dell'app e l'ascolto del server http è quando si desidera configurare il server https

Per configurare per https, è necessario il codice seguente:

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

L'app di express restituirà solo il server http, non è possibile impostarla in express, quindi sarà necessario utilizzare il comando https server

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

30

Solo a scopo di puntualità ed estendi un po 'la risposta di Tim.
Dalla documentazione ufficiale :

L'app restituita da express () è in realtà una funzione JavaScript, PROGETTATA DA PASSARE ai server HTTP di Node come callback per gestire le richieste.

Ciò semplifica fornire a entrambe le versioni HTTP e HTTPS della tua app la stessa base di codice, poiché l'app non eredita da queste (è semplicemente un callback):

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

Il metodo app.listen () restituisce un oggetto http.Server e (per HTTP) è un metodo pratico per quanto segue:

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

1
Spiega un po 'di più sul secondo pezzo di codice. Cosa intendi esattamente con un metodo di convenienza qui?
Aakash Verma,

@AakashVerma questo è solo un pezzo del codice sorgente di exress che può essere trovato express/lib/appplication.jse nient'altro che un collegamento per creare il server http del nodo.
Ivan Talalaev,

Quindi intendi dire che quando usiamo l'app di express () come callback, riceve la richiesta dal server HTTP esterno (tramite 80 o 443) e quindi crea un altro server virtuale http dentro di sé e lo usa per ascoltare alle richieste inoltrate ad esso?
Aakash Verma,

10

Sono arrivato con la stessa domanda ma dopo google ho scoperto che non c'è grande differenza :)

Da Github

Se si desidera creare sia un server HTTP che HTTPS, è possibile farlo con i moduli "http" e "https" come mostrato qui.

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

Anche se vuoi lavorare con socket.io vedi il loro esempio

Vedi questo

Io preferisco app.listen():)


9

Express è fondamentalmente un wrapper del modulo http creato per la facilità degli sviluppatori in modo tale che ...

  1. Possono impostare i middleware per rispondere alle richieste HTTP (facilmente) usando express.
  2. Possono eseguire il rendering dinamico di pagine HTML in base al passaggio di argomenti ai modelli utilizzando express.
  3. Possono anche definire il routing facilmente usando express.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.