Node.js:检查事件循环中剩余的内容,防止脚本无法自然退出

88

如果主事件循环中还有回调函数未完成,Node.js脚本将无法退出。虽然可以通过调用process.exit()或抛出异常来强制终止脚本,但建议始终进行适当的清理,让脚本自然终止。然而,由于代码中的错误可能会阻止适当的清理(例如,忘记在不再需要时删除IntervalObject),因此有时会很难执行这种操作,从而导致程序无法终止。

因此,是否有一种方法可以调试非终止脚本以查找事件循环中尚未完成的内容?换句话说,在Node.js中是否有一种方法可以调试阻止程序退出的原因?


3
也许这个链接对你有用:https://dev59.com/p2cs5IYBdhLWcg3wMxFF。 - Stefano Falsetto
1
@StefanoF 不,我认为那是无关紧要的。不过还是谢谢你的评论。 - KFL
3个回答

76
您可以调用 process._getActiveRequests() 获取活动 I/O 请求列表, 并使用 process._getActiveHandles() 获取打开的句柄/文件描述符列表。

8
建议使用类似 wtfnodewhy-is-node-running 或者 active-handles 的 NPM 模块来确定哪一段代码引起了问题。 - cwouter
但要谨慎行事:请检查npm注册表上每个模块的活动情况:wtfnodewhy-is-node-runningactive-handles。在这三个模块中,只有"why is node running"在2023年仍然有意义。 - undefined

33

wtfnode包利用了@mscdex提到的工具,但以更加开发者友好的方式呈现。我强烈推荐它来跟踪这些恼人的问题。

const wtf = require('wtfnode');

// ...

wtf.dump();

3

从版本8开始,Node.js提供了一个方便的模块来检索此类信息。

async_hooks:一个API,用于注册回调,跟踪在Node.js应用程序中创建的异步资源的生命周期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接