Express.js - app.listen против server.listen

439

Это может быть очень простой вопрос, но я просто не понимаю. В чем разница между созданием приложения с использованием 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, то получу такой же вывод.

Тамас
источник
25
Некоторое время я задавался этим вопросом ... Хороший вопрос!
Стейн де Витт
2
Я понимаю, что этот вопрос старый, но хочу отметить, что createServer устарел.
Филипп Киркбрайд
@PhilipKirkbride Можете ли вы предоставить доказательства?
Янот
12
@PhilipKirkbride Я считаю, что это несколько вводящее в заблуждение утверждение. Метод ExpressJS createServer () устарел, но HTTP-модуль Node.js все еще использует createServer (), и это не рекомендуется.
Тамас

Ответы:

563

Вторая форма (создание сервера 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) {
  ...
});
robertklep
источник
2
поэтому require ('http "). createServer (require (" express ")). listen (80) = == require (" express ") (). listen (80)?
user2167582
7
@ user2167582 Эффект тот же, да, но, конечно, буквальное ===сравнение не получится;) Если вы мне не верите, всегда есть источник .
Робертклеп
1
находится var socketio = require('socket.io')на третьей линии , необходимой в вашем переписывания?
davidx1
1
за и против каждого?
Таннер Саммерс
2
@TannerSummers Я практически всегда использую, app.listen()потому что это требует меньше кода. Поскольку это только очень тонкий слой поверх него server.listen()и он возвращает экземпляр сервера, обычно нет причин создавать отдельный экземпляр HTTP-сервера вручную.
Робертклеп
64

Существует еще одно различие в использовании приложения и прослушивании 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);
Тим
источник
30

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

Приложение, возвращаемое функцией 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);
};
Иван Талалаев
источник
1
Пожалуйста, объясните немного больше о втором фрагменте кода. Что именно вы подразумеваете под удобным методом здесь?
Аакаш Верма
@AakashVerma это просто фрагмент исходного кода exress, который можно найти express/lib/appplication.jsи не более чем ярлык для создания http-сервера узла.
Иван Талалаев
Итак, вы хотите сказать, что когда мы используем app by express () в качестве обратного вызова, он получает запрос от внешнего HTTP-сервера (через 80 или 443), а затем создает внутри себя другой виртуальный сервер http.Server и использует его для прослушивания. на запросы, направленные на него?
Аакаш Верма
10

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

Мухаммед Шахзад
источник
9

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

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