我一直在尝试终止进程之前执行异步操作。
说“终止”是指终止的所有可能性:

  • ctrl+c
  • 未捕获的异常
  • 崩溃
  • 代码结尾
  • 一切..

  • 据我所知,exit事件仅用于同步操作。
    阅读Nodejs文档后,我发现 beforeExit 事件用于异步操作BUT:

    有什么建议?

    最佳答案

    您可以捕获信号并在退出之前执行异步任务。这样的事情会在退出之前调用terminator()函数(甚至代码中的javascript错误):

    process.on('exit', function () {
        // Do some cleanup such as close db
        if (db) {
            db.close();
        }
    });
    
    // catching signals and do something before exit
    ['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
        'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
    ].forEach(function (sig) {
        process.on(sig, function () {
            terminator(sig);
            console.log('signal: ' + sig);
        });
    });
    
    function terminator(sig) {
        if (typeof sig === "string") {
            // call your async task here and then call process.exit() after async task is done
            myAsyncTaskBeforeExit(function() {
                console.log('Received %s - terminating server app ...', sig);
                process.exit(1);
            });
        }
        console.log('Node server stopped.');
    }
    

    添加评论中要求的详细信息:
  • 从节点的documentation解释的信号,此链接引用标准POSIX signal names
  • 信号应为字符串。但是,我已经看到其他人进行了检查,因此可能还有一些我不知道的其他意外信号。只是想确保在调用process.exit()之前。我认为反正并不需要花费很多时间。
  • db.close()的
  • ,我想这取决于您使用的驱动程序。是否是异步的同步。即使它是异步的,并且您在db关闭后也不需要执行任何操作,但这应该没问题,因为async db.close()只会发出close事件,并且无论您的服务器是否退出,事件循环都将继续对其进行处理。
  • 09-11 19:54
    查看更多