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, созданная для удобства разработчиков таким образом, что..
- Они могут настроить промежуточное программное обеспечение для ответа на HTTP-запросы (легко) с помощью экспресс.
- Они могут динамически отображать HTML-страницы на основе передачи аргументов в шаблоны с помощью Express.
- Они также могут легко определять маршрутизацию, используя экспресс.
Модуль http больше не нужен, если только вам не нужно напрямую с ним работать (socket.io/SPDY/HTTPS). Приложение можно запустить с помощьюapp.listen()
функция.