Разве этот код Node / Express не создает два сервера? - PullRequest
2 голосов
/ 03 августа 2020

Я начинаю разработку с Node & Express. Мне удалось создать несколько приложений, в том числе портал для компании друга. Теперь я хочу попробовать Socket.io и WebRT C, и, изучая новое приложение, я заметил, что они оба используют что-то похожее на следующий код:

const express = require('express')

const app = express()
const server = require('http').createServer(app)
const port = process.env.PORT || 3000

// just to test the server
app.get('/', (req, res) => {
  res.status(200).send('Working')
})

server.listen(port, () => {
  console.log(`Server running on port: ${port}`)
})

Мои вопросы:

Разве этот код не создает ДВА серверов? Я имею в виду, если Express может обрабатывать запросы и ответы, зачем мне использовать модуль 'http'?

Заранее благодарю тех, кто готов научить новичка ie без осуждения.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Разве этот код не создает ДВА сервера?

Нет, код, который вы показываете, создает только один 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) чтобы запустить.

0 голосов
/ 03 августа 2020

Это должно сработать для вас. Вам не нужна упомянутая вами строка.

const express = require('express')

const app = express()
const port = process.env.PORT || 3000

// just to test the server
app.get('/', (req, res) => {
  res.status(200).send('Working')
})

app.listen(port, () => {
  console.log(`Server running on port: ${port}`)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...