Javascript node.js:程序意外退出或挂起
我在node.js中编写了一个模块来执行一些网络操作。我编写了一个使用此模块的小脚本(下面的变量Javascript node.js:程序意外退出或挂起,javascript,node.js,asynchronous,server-side,node-async,Javascript,Node.js,Asynchronous,Server Side,Node Async,我在node.js中编写了一个模块来执行一些网络操作。我编写了一个使用此模块的小脚本(下面的变量check)。看起来是这样的: check(obj, function (err, results) { // ... console.log("Check completed"); }); 现在有一件有趣的事。当此代码作为mocha测试的一部分执行时,测试将按预期退出。我看到日志语句已打印,进程已退出 当代码作为独立节点脚本执行时,会打印log语句,但进程只是挂起 当我尝试调试它,
check
)。看起来是这样的:
check(obj, function (err, results) {
// ...
console.log("Check completed");
});
现在有一件有趣的事。当此代码作为mocha
测试的一部分执行时,测试将按预期退出。我看到日志语句已打印,进程已退出
当代码作为独立节点脚本执行时,会打印log语句,但进程只是挂起
当我尝试调试它,并使用--debug brk
和节点检查器启动程序时,它会提前退出!我看到调用了process.on“exit”
。它在模块内的一些内部回调尚未调用时退出。所以上面的日志语句也没有打印出来
我现在陷入困境,不知道为什么会发生这种情况。有人见过类似的行为吗?当您将其作为脚本运行时,它在“完成”时挂起,这意味着节点仍有注册的回调等待事件。Node不知道这些事件将不再触发。如果知道该退出了,您可以调用process.exit()
,也可以显式地关闭/取消绑定/断开所有连接(网络连接、数据库连接等)。若您正确地关闭了所有内容,那个么节点应该退出
模块(Nathan Arthur提到过)或可以非常有助于跟踪此问题。如果程序意外退出,可能是因为事件循环变为空,没有其他事情可做(因为某些代码忘记发出错误或执行其他操作以保持事件循环继续)。在本例中,节点以代码0退出,您将不会得到任何错误消息,因此可能会非常混乱
有关这种情况的示例,请参阅。是否有办法找出保持节点打开的原因?如果您有节点检查器,并且可以附加到流程并在节点的事件循环代码中设置断点,则可能。我从未成功地找到过其中一个。这要么是很明显的事情,比如打开DB连接但从不显式关闭它,要么就是我只做process.exit()
,然后继续我的生活.process.\u getActiveHandles()和process.\u getActiveRequests()查看非常有用的提示!救了我!“为什么节点正在运行”似乎具有阻止其在节点5和/或请求模块上工作的功能。他为我工作。