9

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

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

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

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

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

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

4

2 回答 2

18

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

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

于 2013-04-07T02:28:30.757 回答
0

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

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

于 2020-09-29T21:21:49.773 回答