Разве этот код не создает ДВА сервера?
Нет, код, который вы показываете, создает только один http-сервер.
Вот аннотированная версия вашего кода, которая объясняет, что делает каждая строка:
// load the express module
const express = require('express')
// create an Express app object
const app = express()
// create an http server object and pass it the Express app object as a request handler
// this is a server object, but is not yet a running server
const server = require('http').createServer(app)
// decide what port we're going to use for the http server
const port = process.env.PORT || 3000
// create one Express route handler on the Express app object
app.get('/', (req, res) => {
res.status(200).send('Working')
})
// start up the server on the desired port so it is now actually running
// and log to the console when the server has finished starting up and is ready
// for incoming http requests
server.listen(port, () => {
console.log(`Server running on port: ${port}`)
})
Я имею в виду, если Express может обрабатывать запросы и ответы, зачем мне использовать модуль 'http'?
Express - это фреймворк для обработки входящих HTTP-запросов. Сам Express не содержит кода HTTP-сервера, а объект app
в вашем коде не является самим сервером. Это объект, который используется для координации и организации обработчиков запросов для входящих HTTP-запросов. Входящие HTTP-запросы поступают с http-сервера, который должен быть создан отдельно от Express.
Некоторый код где-то должен создать http-сервер, а затем подключить к нему ваш Express объект приложения. Есть несколько способов создать http-сервер, который вы собираетесь использовать с Express. Ваш код с использованием http.createServer(app)
, за которым следует server.listen()
, показывает один из таких способов сделать это.
Есть и другие способы создания http-сервера для использования с Express. Например, метод app.listen()
может создать http-сервер и автоматически привязать к нему объект app
.
Если вы посмотрите исходный код для app.listen()
, вы увидите это:
app.listen = function listen() {
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
Все, что он делает, - это создает http-сервер с объектом app
в качестве слушателя и затем вызывает .listen()
на этом новом сервере. По сути, это то же самое, что вы делаете сами с http.createServer(app)
, а затем server.listen(...)
.
Но во всех случаях здесь какой-то код где-то использует http.createServer(...)
для создания объекта сервера, а затем server.listen(port)
чтобы запустить.