Node.js:程序意外退出或只是挂起



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

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

有趣的是。当这段代码作为mocha测试的一部分执行时,测试按预期退出。我看到日志语句打印出来,进程退出。

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

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

我现在卡住了,我不知道为什么会发生这种情况。有人见过类似的行为吗?

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

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

如果程序意外退出,可能是因为事件循环变为空并且没有其他事情可做(因为某些代码忘记发出错误或做其他事情以保持事件循环继续进行)。在这种情况下,Node以代码0退出,您将不会得到任何错误消息,因此它真的很令人困惑。

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

最新更新