即使在事件循环中没有要执行的回调,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 服务器如何保持运行?的主要内容,如果未能解决你的问题,请参考以下文章