Express.js - app.listen vs server.listen


439

Essa pode ser uma pergunta muito básica, mas eu simplesmente não entendo. Qual é a diferença entre criar um aplicativo usando o Express.js e iniciar o aplicativo escutando na porta 1234, por exemplo:

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

//app.configure, app.use etc

app.listen(1234);

e adicionando um servidor 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 é a diferença?
Se eu navegar para http://localhost:1234, então recebo a mesma saída.


25
Estive me perguntando isso há algum tempo ... Boa pergunta!
Stijn de Witt

2
Sei que essa pergunta é antiga, mas quero observar que o createServer foi depreciado.
Philip Kirkbride

@PhilipKirkbride Você pode, por favor, fornecer prova?
yanot

12
@PhilipKirkbride Acredito que seja uma afirmação um tanto enganadora. O método createServer () do ExpressJS foi descontinuado, mas o módulo HTTP Node.js. ainda usa createServer () e isso não está descontinuado.
Tamas

Respostas:


563

O segundo formulário (criando você mesmo um servidor HTTP, em vez de fazer com que o Express crie um para você) é útil se você deseja reutilizar o servidor HTTP, por exemplo, para executar socket.iona mesma instância do servidor HTTP:

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

No entanto, app.listen()também retorna a instância do servidor HTTP, portanto, com um pouco de reescrita, você pode obter algo semelhante sem criar um servidor 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
assim o exigir ( 'http ") createServer (require (." expresso "(expresso") () ouvidos (80))) ouvir (80) é === exigem.".?
user2167582

7
@ user2167582 o efeito é o mesmo, sim, mas é claro que uma ===comparação literal falharia;) Se você não acredita em mim, sempre existe a fonte .
Robertklep

1
está var socketio = require('socket.io')na terceira linha necessária em sua reescrita?
Davidx1

1
prós e contras de cada um?
Tanner Summers

2
@TannerSummers Eu praticamente sempre uso app.listen()porque requer menos código. Como é apenas uma camada muito fina server.listen()e retorna a instância do servidor, geralmente não há motivo para criar manualmente uma instância separada do servidor HTTP.
Robertklep

64

Há mais uma diferença de usar o aplicativo e ouvir o servidor http é quando você deseja configurar o servidor https

Para configurar para https, você precisa do código abaixo:

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

O aplicativo do express retornará apenas o servidor http; você não pode configurá-lo no express; portanto, será necessário usar o comando https server

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

30

Apenas para fins de pontualidade e estenda um pouco a resposta de Tim.
Da documentação oficial :

O aplicativo retornado por express () é, de fato, uma função JavaScript, PROJETADA PARA SER PASSADA aos servidores HTTP do Node como um retorno de chamada para manipular solicitações.

Isso facilita o fornecimento das versões HTTP e HTTPS do seu aplicativo com a mesma base de código, pois o aplicativo não herda delas (é simplesmente um retorno de chamada):

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

O método app.listen () retorna um objeto http.Server e (para HTTP) é um método conveniente para o seguinte:

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

1
Explique um pouco mais sobre o segundo pedaço de código. O que exatamente você quer dizer com método de conveniência aqui?
Aakash Verma

@AakashVerma, este é apenas um código-fonte do exress que pode ser encontrado express/lib/appplication.jse nada mais que um atalho para criar o servidor http do nó.
Ivan Talalaev

Então, você quer dizer que, quando usamos o app por express () como retorno de chamada, ele recebe a solicitação do servidor HTTP externo (por meio de 80 ou 443) e cria outro servidor virtual http.Server em si e o usa para ouvir aos pedidos encaminhados a ele?
Aakash Verma

10

Eu vim com a mesma pergunta, mas depois do google, descobri que não há grande diferença :)

Do Github

Se você deseja criar um servidor HTTP e HTTPS, faça isso com os módulos "http" e "https", como mostrado aqui.

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

Além disso, se você quiser trabalhar com o socket.io, veja o exemplo deles.

Veja isto

Eu prefiro app.listen():)


9

Express é basicamente um invólucro do módulo http criado para facilitar os desenvolvedores de tal maneira que ..

  1. Eles podem configurar middlewares para responder a solicitações HTTP (facilmente) usando express.
  2. Eles podem renderizar páginas HTML dinamicamente com base na passagem de argumentos para modelos usando express.
  3. Eles também podem definir o roteamento facilmente usando express.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.