【发布时间】:2021-02-24 04:18:36
【问题描述】:
我想知道是否有任何方法可以在 Node.JS 的 process 模块上声明事件侦听器。即能够在一个全局文件中定义事件监听器,该文件适用于整个项目。
例如:我希望能够侦听进程模块的on(exit) 事件以在进程退出之前执行一些日志记录,并使用提到的或默认的exitCode(这是在我调用的单独文件中process.exit()
if(!process.env.TELEGRAM_TOKEN) {
process.exit(100);
}
我在另一个模块中的监听器声明为:
process.on("exit", (code) => {
switch(code) {
case 100:
console.error(`${code} - ${NO_API_KEYS}`);
break;
default:
console.error(`${code} - ${DEFAULT_EXIT_ERROR}`)
}
});
问题是 - 它以代码 100 退出,但它从不记录在事件侦听器上定义的 console.error()。
【问题讨论】:
-
好吧,
process是一个全局对象,因此您可以收听exit或message或beforeExit消息或它从项目中的任何位置发出的任何其他消息。例如,您可以将其放在任何位置:process.on('exit', function(existCode) { /* your code here */});. -
你说“进程事件是从同一个文件执行的”是什么意思?您可以从 nodejs 进程中的任何文件中收听
process.on('exit', ...)。如果这不起作用,那么您做错了,需要显示您的代码,以便我们可以帮助您了解您做错了什么。 -
不需要
import process。它是一个全球性的。您可以直接引用它而无需导入。我不知道这是否会有所不同。 -
您是否 100% 确定其他模块已实际加载并运行?如果您在
process.on('exit', ...)代码之前放置一个console.log("registering process.on(exit) handlers"),它会显示在控制台中吗?我无法重现您的问题。 -
另外,如果您查看代码]here](github.com/nodejs/node/blob/master/lib/internal/process/…) 为
process.exit(),您可以看到它调用process.emit('exit', process.exitCode),它将同步调用exit的所有注册处理程序事件。
标签: javascript node.js events event-handling eventemitter