我在node.js中编写了一个执行网络操作的模块。我写了一个使用这个模块的小脚本(下面的变量check
)。它看起来像这样:
check(obj, function (err, results) {
// ...
console.log("Check completed");
});
现在这是有趣的事情。当此代码作为mocha
测试的一部分执行时,测试将按预期退出。我看到打印了日志语句并退出了该过程。
当代码作为独立节点脚本执行时,会打印日志语句,但该过程会挂起。
当我尝试调试它并使用--debug-brk
启动程序并使用node-inspector
时,它会提前退出!我看到process.on 'exit'
被调用了。当模块中的一些内部回调尚未被调用时它退出。因此,上面的日志语句也不会打印出来。
我现在被困住了,不知道为什么会这样。有没有人见过类似的行为?
答案 0 :(得分:13)
当您将其作为脚本运行并且在“完成”时挂起时,这意味着节点仍然具有已注册等待事件的回调。 Node不知道那些事件不会再发生了。如果您知道是时候退出,可以只调用process.exit()
,也可以显式关闭/取消绑定/断开所有内容(网络连接,数据库连接等)。如果正确关闭所有内容,则应退出节点。
模块wtfnode(由Nathan Arthur提及)或why-is-node-running可能非常有助于跟踪此问题。
答案 1 :(得分:0)
如果程序意外退出,则可能是因为事件循环变为空并且无事可做(因为某些代码忘记发出错误或执行其他操作以保持事件循环继续进行)。在这种情况下,Node退出并显示代码0,并且您将不会收到任何错误消息,因此它确实很令人困惑。
有关发生这种情况的示例,请参见https://github.com/archiverjs/node-archiver/issues/457。