Javascript 如何在Express上挂接进程退出事件?
我将钩住进程退出事件,并在退出之前更新数据库字段。 正在出口处显示更新。但没有执行进一步的行动 DB是Mongo 然后,此代码处于开发模式,因此我使用Javascript 如何在Express上挂接进程退出事件?,javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,我将钩住进程退出事件,并在退出之前更新数据库字段。 正在出口处显示更新。但没有执行进一步的行动 DB是Mongo 然后,此代码处于开发模式,因此我使用ctrl+c终止此过程。对于ctrl-c(您现在已添加到问题中),您无法执行您想执行的操作。node.js没有该功能 由于Ctrl-C在您的控制之下,您可以向服务器发送一个命令来执行正常关闭,然后它可以执行异步工作,然后调用process.exit(),而不是在控制台中键入Ctrl-C。这是许多真正的服务器在生产中所做的。他们有一个控制端口(外部世
ctrl+c
终止此过程。对于ctrl-c(您现在已添加到问题中),您无法执行您想执行的操作。node.js没有该功能
由于Ctrl-C在您的控制之下,您可以向服务器发送一个命令来执行正常关闭,然后它可以执行异步工作,然后调用process.exit()
,而不是在控制台中键入Ctrl-C。这是许多真正的服务器在生产中所做的。他们有一个控制端口(外部世界无法访问),您可以向其发出命令,其中之一就是执行受控关闭
原始答案
(在提到Ctrl-C是关闭启动之前)
您无法在退出事件上运行异步操作(在关闭序列中为时已晚)
您可以在上运行异步操作
但是,beforeExit
事件只有在nodejs自动退出时才会被调用,因为它的剩余调度工作队列是空的(没有打开的套接字、文件、计时器等)。如果进程异常退出(例如未处理的异常或Ctrl-C),或者手动调用了process.exit()
,则不会调用它
您可以处理手动调用
process.exit()
的情况,方法是将应用程序中对process.exit()
的调用替换为对执行整理工作的自定义关闭函数的调用,然后在调用成功完成后,调用process.exit()
这就是你要找的吗?@O.O-现在这个问题已经被编辑成关于Ctrl-C关闭的问题,这个链接不会有帮助。好的。我以开发模式运行此代码,并使用ctrl退出+c@tpikachu“不工作”是什么意思?正如我上面所解释的,在异常关闭期间,没有机制进行异步调用。您没有在问题中提到这是Ctrl-C中止。无法做到这一点。对于导致显式终止的条件,例如调用process.exit()或未捕获的异常.process.on('beforexit',async()=>{console.log('xxxxx')})@tpikachu,不会发出'beforexit'事件。我的回答明确指出,这仅适用于正常关闭。您的问题没有说明您试图在Ctrl-C.Nodejs上执行此操作。不提供您想要的功能。
process.on('exit', async () => {
console.log('updating')
await campaignHelper.setIsStartedAsFalse()
console.log('exit')
process.exit(1)
})