【问题标题】:Node.JS Process global event listenersNode.JS 处理全局事件监听器
【发布时间】: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 是一个全局对象,因此您可以收听exitmessagebeforeExit 消息或它从项目中的任何位置发出的任何其他消息。例如,您可以将其放在任何位置: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


【解决方案1】:

您的模块似乎没有被加载,因此永远不会运行代码来为exit 事件注册事件处理程序。

要运行它的初始化代码,您所要做的就是从您的主应用模块或属于您的应用初始化的任何其他模块导入该模块。

import './mymodule.js'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 2010-10-30
    • 2021-10-17
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多