调试node.js上的正常关闭

时间:2016-05-10 07:40:47

标签: node.js debugging

我的app.js中有以下代码:

process.stdin.resume();//so the program will not close instantly

//do something when app is closing
process.on('exit',exitHandler.bind(null,{exit:true,event: "exit"}));

//catches uncaught exceptions
process.on('uncaughtException',exitHandler.bind(null, {exit:false,event: "uncaughtException"}));

我阅读了有关正常关闭node.js服务器的所有内容,但无法找到有关如何调试它的任何内容。

问题是,当您单击调试控制台中的“停止”按钮时,IDE必须终止/终止节点进程。

有没有人知道我如何调试优雅的关机代码? 关闭调试会话时,调试模式永远不会在exitHandler内的断点处停止。

我正在使用WebStorm,但我读到其他IDE也可能会发生同样的情况。

由于

1 个答案:

答案 0 :(得分:2)

嗯,没有魔力。要获得'exit'事件,您的代码最终必须点击process.exit()代码,并获得'uncaughtException',您需要提出未处理的异常。

也许有一种疯狂的方法来触发这段代码而不创建实际的事件,但是你应该坚持正常的程序生命周期,因为这就是生产中的工作方式 - 这绝对是你想要测试的。

练习:如果你想查看一次是否正确,你可以只为你的应用程序手动添加正确的代码,这样一旦加载它就会被触发:

setTimeout(function() {
    process.exit(1);
    // or throw new Error("Uncaught exception");
}, 2000);

调试,然后删除。

如果您计划以某种方式将其集成到某些测试中,则需要在代码中保持以下行为,并添加触发它的方法:

.... // when app is loaded
if (process.env.NODE_TEST_TRIGGER_PROCESS_EXIT) {
    process.exit(1);
}

并添加执行方案以使用适当的选项运行它:

$ NODE_TEST_TRIGGER_PROCESS_EXIT=true node myapp.js

UPD:如果你真的不关心不同的事件,请检查其他信号:https://nodejs.org/api/process.html#process_signal_events也许app会收到SIGINT或SIGTERM。但如果它是SIGKILL,你仍然无法捕获它,所以你必须自己创建事件。