我一直在研究节点环境,并意识到我无法编写成功调用 process.exit() 的 setTimeout 函数的脚本。经过一番尝试和错误后,我明白节点进程是使用 --watch-path 的命令行参数启动的,我认为它创建了一个未处理的承诺。
这是启动该过程的节点命令:
"node --env-file=.env --loader ts-node/esm --watch-path=./src index.ts"
这是我结束该过程的代码块:
if (process.argv[1] === import.meta.filename) { //if this file is first executed file on node process
fastify.listen({port: Number(process.env.PORT), host: process.env.HOST}, (err, address) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
console.log(`App listening address: ${address} , on port ${process.env.PORT}`);
console.log("node environment: ", process.env.NODE_ENV);
(() => {
console.log("closing server...");
setTimeout(function () {
fastify.close();
process.exit(0);
}, 3500)
})();
});
}
我已经运行了 A/B 比较来验证我的数据库和开发服务器连接是否全部正确关闭。唯一的区别是启动进程时是否设置了 --watch 标志。有没有办法编写一个解决方法来解决正在监视的文件的这一承诺?
我尝试调用 process.exit() 期望进程结束...而不是进程继续空闲运行。
好吧,问题是当我们使用
--watch-path
选项时,节点 js 在该路径上创建一个观察程序,这就是为什么即使在使用 process.exit()
或 setTimeout 关闭服务器后进程也不会退出。
由于观察者使进程保持活动状态并继续等待文件更改并阻止进程完全存在,因为事件循环总是有东西并且永远不会为空。
对于这个问题,您可以使用不同的观察工具,例如 Nodemon 或 ts-node-dev
nodemon --exec "node --env-file=.env --loader ts-node/esm index.ts" --watch ./src
或者您可以使用带有信号的 process.exit()
if (process.argv[1] === import.meta.filename) { //if this file is first executed file on node process
fastify.listen({port: Number(process.env.PORT), host: process.env.HOST}, (err, address) => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
console.log(`App listening address: ${address} , on port ${process.env.PORT}`);
console.log("node environment: ", process.env.NODE_ENV);
(() => {
console.log("closing server...");
setTimeout(function () {
fastify.close(() => {
console.log("Server is closed");
process.kill(process.pid, 'SIGTERM');
});
}, 3500)
})();
});
}