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

Posted

技术标签:

【中文标题】即使在事件循环中没有要执行的回调,Node.js Web 服务器如何保持运行?【英文标题】:How does A Node.js Web Server Keep Running Even When There Are No Callbacks To Be Executed In The Event Loop? 【发布时间】:2019-10-18 09:06:13 【问题描述】:

下面的代码是一个简单的 Node.js Web 服务器,它在 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 程序无法退出呢?

【问题讨论】:

server.listen 创建一个长时间运行的进程——“监听”进一步的请求。 【参考方案1】:

Node.js 不会仅仅因为事件循环没有待处理的工作而退出。 (可悲的是,This page 在这方面是不完整的误导。)如果出现以下情况,它将退出:

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

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

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

【讨论】:

可能还值得一提的是,这里显示的实际应用程序代码比 javascript 还要多……整个 Node.js 框架。

以上是关于即使在事件循环中没有要执行的回调,Node.js Web 服务器如何保持运行?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 事件循环

Node.js - 为啥我的一些回调没有异步执行?

node.js 回调函数事件循环EventEmitter ar

Node.js 事件循环

node事件循环

[nodejs基础]eventloop机制图解