Express.js - app.listen против 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');
var http = require('http');

var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

Какая разница?
Если я перейду к http://localhost:1234Таким образом, я получаю такой же вывод.

6 ответов

Решение

Вторая форма (создание сервера 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) {
  ...
});

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

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

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

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

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

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

Приложение, возвращаемое функцией express(), на самом деле представляет собой функцию JavaScript, предназначенную для передачи на HTTP-серверы Node в качестве обратного вызова для обработки запросов.

Это упрощает предоставление версий вашего приложения как 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);
};

Я пришел с тем же вопросом, но после 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, посмотрите их пример.

Смотрите это

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

Express - это, по сути, оболочка модуля http, созданная для удобства разработчиков таким образом, что..

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

Модуль http больше не нужен, если только вам не нужно напрямую с ним работать (socket.io/SPDY/HTTPS). Приложение можно запустить с помощьюapp.listen()функция.

expressjs.com

Другие вопросы по тегам