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()
:)