【问题标题】:How to hook process exit event on Express?如何在 Express 上挂钩进程退出事件?
【发布时间】:2020-05-03 13:43:39
【问题描述】:
process.on('exit', async () => {
  console.log('updating')
  await campaignHelper.setIsStartedAsFalse()
  console.log('exit')
  process.exit(1)
})

我将在退出前挂钩进程退出事件并更新数据库字段。 退出时显示更新。但不会执行进一步的操作。

DB 是 Mongo

然后这段代码处于开发模式,所以我使用ctrl+c 来终止进程。

【问题讨论】:

  • 这是link你要找的吗?
  • @O.o - 现在这个问题已被编辑为关于 Ctrl-C 关闭该链接将无济于事。

标签: javascript node.js express mongoose


【解决方案1】:

对于 Ctrl-C(您现在已将其添加到您的问题中),您不能做您想做的事情。 node.js 没有这个功能。

由于 Ctrl-C 在您的控制之下,您可以向您的服务器发送命令以进行正常关闭,然后它可以执行您的异步工作,然后调用 process.exit() 而不是您只需键入 Ctrl-C在控制台中。这就是许多真实服务器在生产中所做的事情。它们有一个控制端口(外部世界无法访问),您可以向其发出命令,其中之一是进行受控关闭。

原答案

(在提到 Ctrl-C 是关机启动之前)

您不能对exit 事件运行异步操作(在关闭序列中为时已晚)。

您可以在beforeExit event 上运行异步操作。

但是,beforeExit 事件只有在 nodejs 自然退出时才会被调用,因为它的剩余调度工作队列是空的(没有打开的套接字、文件、计时器等)。如果进程异常退出(如未处理的异常或Ctrl-C)或手动调用process.exit(),则不会调用。

您可以处理手动调用 process.exit() 的情况,方法是将应用程序中对 process.exit() 的调用替换为调用自定义关闭函数来执行您的内务管理工作,然后在成功完成后调用 @ 987654329@.

【讨论】:

  • 好的。我将此代码作为开发模式运行并使用 ctrl+c 退出
  • @tpikachu - “不工作”是什么意思?正如我上面解释的,在异常关闭期间没有进行异步调用的机制。你没有在你的问题中提出它是 Ctrl-C 中止。没有办法做到这一点。
  • 对于导致显式终止的条件,例如调用 process.exit() 或未捕获的异常,不会发出 'beforeExit' 事件。
  • process.on('beforeExit', async () => { console.log('xxxxx') })
  • @tpikachu - 我的回答明确指出这只适用于正常关机。您的问题并未说明您试图在 Ctrl-C 上执行此操作。节点。不提供您想要的功能。
猜你喜欢
  • 1970-01-01
  • 2019-07-04
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多