我使用mocha和Nodejs来测试我的restApi。
当我运行mocha时,我告诉我的测试创建一个child_process
并运行API,以便我可以向它发出请求。
问题是当测试退出(完成或崩溃)时,似乎API一直在后台运行。我在这里看到了一些答案,指示在主进程退出时手动终止子进程。所以我这样做了:
export function startProcess(done) {
const child = spawn('babel-node', ["app.js"]);
child.stdout.on("data", function(data) {
data = data.toString();
// console.log(data.toString());
if(data.indexOf("Server online") > -1) done();
});
child.stderr.on('data', function(err) {
console.log("ERROR: ", err.toString());
});
child.on('exit', function(code) {
console.log("PROPERLY EXITING");
console.log("Child process exited with code", code);
});
process.on('exit', function(code) {
console.log("Killing child process");
child.kill();
console.log("Main process exited with code", code);
});
}
当主进程退出时,它会记录"杀死子进程",这意味着确实调用了child.kill()
。但是如果我再次尝试运行我的测试,当调用spawn命令时,API会抛出错误
错误:听EADDRINUSE ::: 3300
,意味着API仍在运行,并且已采用该端口地址。
所以我必须运行sudo pkill node
来真正杀死所有节点进程,然后npm test
再次运行。
我错过了什么吗?这真的是实现我期待的方式吗?
我考虑过使用child_process.exec
在我的sudo pkill node
听众上运行process.on('exit')
,但这似乎不是一件好事。
Mac和Ubuntu都会发生这种情况。
有什么建议吗? 感谢
答案 0 :(得分:1)
“退出”是一个事件,该事件在节点内部完成其事件循环时触发,而在您外部终止该过程时不会触发。
您正在寻找的是在SIGINT上执行某些操作。