Express.js - app.listen vs server.listen

Это может быть очень простой вопрос, но я просто не понимаю. В чем разница между созданием приложения с помощью Express.js и началом прослушивания приложения на порту 1234, например:

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

//app.configure, app.use etc

app.listen(1234);

и добавление http-сервера:

var express = require('express'), http = require('http');
var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

Какая разница? Если я перейду к http://localhost:1234 - я получаю тот же результат...

Ответ 1

Вторая форма (создание собственного HTTP-сервера, а не создание Express для него) полезно, если вы хотите повторно использовать HTTP-сервер, например, для запуска socket.io в том же экземпляре 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() также возвращает экземпляр HTTP-сервера, поэтому с небольшим количеством перезаписи вы можете добиться чего-то подобного, не создавая сам 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

Есть еще одна разница в использовании приложения и прослушивании http-сервера, когда вы хотите настроить сервер https

Для настройки для https вам понадобится следующий код:

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

Приложение из express вернет только HTTP-сервер, вы не можете установить его в экспресс, поэтому вам нужно будет использовать команду https server

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

Ответ 3

Просто для цели пунктуальности и продлить бит ответа Тима.
Из официальная документация:

Приложение, возвращаемое функцией express(), фактически является функцией JavaScript, ПРОСМОТРЕННО ДЛЯ ПРОСМОТРЕТЬ до Node s HTTP-серверов в качестве обратного вызова для обработки запросы.

Это упрощает предоставление как HTTP, так и HTTPS-версий вашего приложение с той же базой кода, что и приложение не наследует от этих (это просто обратный вызов):

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

Метод app.listen() возвращает объект http.Server и (для HTTP) это метод удобства для следующего:

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

Ответ 4

Экспресс в основном представляет собой оболочку http-модуля, созданного для удобства разработчиков таким образом, что..

  • Они могут настроить middlewares для ответа на запросы HTTP (легко) с помощью экспресс.
  • Они могут динамически отображать HTML-страницы, основываясь на передаче аргументов шаблонам с помощью express.
  • Они также могут легко определять маршрутизацию с помощью выражения.

Ответ 5

Я пришел с таким же вопросом, но после google я обнаружил, что нет большой разницы:)

Из Github

Если вы хотите создать сервер HTTP и HTTPS, вы можете сделать это с помощью модулей "http" и "https", как показано здесь.

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

Также, если вы хотите работать с socket.io, см. их пример

См. this

Я предпочитаю app.listen():)