Как веб-сервер Node.js продолжает работать, даже если в цикле событий нет обратных вызовов для выполнения? - PullRequest
2 голосов
/ 02 июня 2019

Код ниже представляет собой простой веб-сервер Node.js, который отвечает на запрос, когда URL-адрес совпадает.

В онлайн-исследовании о node.js утверждается, что как только вы запустите ваш сценарий (node index.js), обратные вызовы будут помещены в соответствующую фазу, а затем после анализа вашего сценария процесс узла войдет в цикл обработки событий ивыполнить соответствующие обратные вызовы, специфичные для фазы.Узел завершится, если больше нет обратных вызовов, которые нужно выполнить.

Поэтому мой вопрос заключается в том, если обработчик запросов запускается в первый раз, когда я посещаю home page "/" ИЛИ Hello Page "/hello ", почему узел все еще остается?выполняется даже после последующих запросов.

const http = require('http');

const server = http.createServer((req,res) => {
  if(req.url === "/") {
    res.end("Home Page")
  }
  else if(req.url === "/hello") {
    res.end("Hello Page")
  }
  else {
    res.end("Page Not Found")
  }
})


server.listen(5000)

Я ожидаю, что после того, как обработчик запросов будет выполнен, он должен быть удален из любой фазы, в которую он был помещен, следовательно, узел должен завершиться. Так что удерживает программу Node отвыход

1 Ответ

6 голосов
/ 02 июня 2019

Node.js не завершается только потому, что нет ожидающей работы для цикла событий. ( Эта страница , к сожалению, вводит в заблуждение, поскольку является неполной в этом отношении.) Она выходит, если:

  1. Нет отложенной работы для цикла событий, и
  2. Нет ожидающих запросов ввода / вывода, а
  3. Нет прослушивающих сокетов сервера ввода-вывода

(Я думаю, что это полный список. Я не могу найти соответствующую документацию, хотя я помню, что читал что-то на их сайте об этом много лет назад.)

Если бы он завершился, когда не было ожидающих работ для цикла обработки событий, он даже не стал бы ждать обратного вызова вашего соединения один раз. Он завершится сразу после вызова listen.

...