Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Express上挂接进程退出事件?_Javascript_Node.js_Express_Mongoose - Fatal编程技术网

Javascript 如何在Express上挂接进程退出事件?

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。这是许多真正的服务器在生产中所做的。他们有一个控制端口(外部世

我将钩住进程退出事件,并在退出之前更新数据库字段。 正在出口处显示更新。但没有执行进一步的行动

DB是Mongo

然后,此代码处于开发模式,因此我使用
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)
})