即使事件循环中没有要执行的回调,Node.js Web服务器如何保持运行?

cla*_*ine 2 javascript node.js nodejs-server

下面的代码是一个简单的Node.js Web服务器,当URL匹配时,它会响应请求。

在线研究node.js的过程表明,一旦启动脚本(node index.js),回调将置于相应的阶段,然后在解析脚本后,节点进程将进入事件循环并执行特定于某个阶段的适当的回调。如果没有更多的回调要执行,节点将退出。

所以我的问题是,当我访问“ home page "/"OR 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)
Run Code Online (Sandbox Code Playgroud)

我希望一旦执行了请求处理程序,就应该将其从已放入的任何阶段中删除,因此节点应该退出。那么,什么阻止Node程序退出呢?

T.J*_*der 6

Node.js不会仅仅因为事件循环没有任何未完成的工作而退出。(可悲的是,此页面在这方面会引起误导。)在以下情况下退出:

  1. 事件循环没有任何待处理的工作,并且
  2. 没有未完成的I / O请求,并且
  3. 没有监听的I / O服务器套接字

(我认为这是一个完整的列表。我找不到相关的文档,尽管我记得几年前在他们的网站上读过一些文章。)

如果在事件循环没有任何待处理的工作时退出,它甚至都不会等待运行您的连接回调一次。listen呼叫后它将立即退出。