node.js:程序要么意外退出,要么只是挂起

Posted

技术标签:

【中文标题】node.js:程序要么意外退出,要么只是挂起【英文标题】:node.js: program either exits unexpectedly or just hangs 【发布时间】:2013-03-29 06:20:05 【问题描述】:

我在 node.js 中编写了一个执行一些网络操作的模块。我写了一个使用这个模块的小脚本(下面的变量check)。它看起来像这样:

check(obj, function (err, results) 
    // ...
    console.log("Check completed");
);

现在有趣的事情来了。当此代码作为mocha 测试的一部分执行时,测试将按预期退出。我看到打印的日志语句并且进程退出。

当代码作为独立节点脚本执行时,会打印日志语句,但进程只是挂起。

当我尝试调试它并使用--debug-brk 启动程序并使用node-inspector 时,它会提前退出!我看到process.on 'exit' 被调用了。它在模块中的一些内部回调尚未被调用时退出。所以上面的日志语句也没有打印出来。

我现在卡住了,不知道为什么会这样。有没有人见过类似的行为?

【问题讨论】:

【参考方案1】:

如果程序意外退出,可能是因为事件循环变空并且没有其他事情可做(因为某些代码忘记发出错误或执行其他操作来保持事件循环继续进行)。在这种情况下,Node 以代码 0 退出,您将不会收到任何错误消息,因此可能会非常混乱。

请参阅 https://github.com/archiverjs/node-archiver/issues/457 了解发生这种情况的示例。

【讨论】:

【参考方案2】:

当您将它作为脚本运行并在“完成”时挂起时,这意味着节点仍然注册了回调以等待事件。 Node 不知道这些事件不会再触发。如果您知道是时候退出,您可以只调用process.exit(),或者您可以显式关闭/取消绑定/断开所有内容(网络连接、数据库连接等)。如果您正确关闭所有内容,则节点应退出。

模块 wtfnode(由 Nathan Arthur 提到)或 why-is-node-running 非常有助于跟踪此问题。

【讨论】:

有什么办法可以找出保持节点打开的原因吗? 如果你有节点检查器并且可以附加到进程并在节点的事件循环代码中设置断点,也许。我从来没有成功地追踪到其中之一。要么是明显的事情,比如打开一个数据库连接,但从未明确关闭它,要么我只是做process.exit() 并继续我的生活。 process._getActiveHandles() 和 process._getActiveRequests() 见***.com/questions/17960452/… 非常有用的提示!救了我! why-is-node-running 似乎有 multiple issues 阻止它在节点 5 和/或请求模块上工作。 wtfnode 为我工作。

以上是关于node.js:程序要么意外退出,要么只是挂起的主要内容,如果未能解决你的问题,请参考以下文章

理解Node.js(译文)

Inflector.php 第 265 行中的 FatalErrorException:语法错误,意外 ':',期待 ';'要么 ''

打开大型 Main.storyboard 时 Xcode 挂起/意外退出

从 node.js/express.js 中的多个异步源构建对象

node.js 应用程序突然以 100% 加载 CPU 并挂起

shell编程基础:逻辑运算