node.js:程序意外退出或挂起

Ais*_*war 8 javascript asynchronous server-side node.js node-async

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

check(obj, function (err, results) {
    // ...
    console.log("Check completed");
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Pet*_*ons 13

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

模块wtfnode(由Nathan Arthur提到)或者为什么是节点运行可以真正有助于跟踪这一点.

  • process._getActiveHandles()和process._getActiveRequests()请参阅http://stackoverflow.com/questions/17960452/how-can-i-get-a-list-of-callbacks-in-the-node-work-queue-或者,为什么-不会节点-EX (6认同)
  • 有什么方法可以找出保持节点开放的内容吗? (5认同)
  • 如果您有节点检查器并且可以附加到进程并在节点的事件循环代码中设置断点,则可能.我从来没有成功跟踪其中一个.它或者是显而易见的事情,比如打开数据库连接,但从不明确地关闭它,或者我只是做`process.exit()`并继续我的生活. (4认同)