处理 Node.js 中致命错误的正确方法

Ami*_*mir 7 javascript error-handling try-catch node.js

通常根据Node.js 文档,使用它不是一个好主意process.exit(),因为异步 IO 操作console.log()或其他日志记录方法(在我的例子中是 Pino日志记录库)可能会被跳过,进程在完成任务之前退出。我想知道处理函数内部错误的最佳方法是什么。我的最终目标是处理函数中的错误,如果错误是致命错误,则退出进程。

我写了一个我目前认为最好的选择的简化版本(类似于 Node.js 文档中解释的解决方案):

const validateUserInput = (input) => {
  try {
    if (input === 'wrong') { throw new Error('sample error'); } // simplified
  } catch (err) {
    console.log('last message');
    // process.exit(1) --> using this might skip IO operation like the log on previous line
    process.exitCode = 1;
    return false;
  }
  return true;
};

if (validateUserInput('wrong')) {
  // rest of the code
}

// nothing should be written here
Run Code Online (Sandbox Code Playgroud)

Edu*_*ard 2

SIGTERM 是告诉进程正常终止的信号。这是从流程管理者(例如新贵或主管等)发出的信号。

您可以在另一个函数中从程序内部发送此信号:阅读更多

process.kill(process.pid, 'SIGTERM')
Run Code Online (Sandbox Code Playgroud)

您还可以为此事件设置自己的侦听器,并执行其他任务。

process.on('SIGTERM', () => {
  server.close(() => {
    console.log('Shutting down the application ...')
  })
})
Run Code Online (Sandbox Code Playgroud)

SIGTERM在 Windows 上不支持,所以你可以使用SIGINT,这里有一个有用的信息SIGINT

收到 SIGINT 信号后,Node.js 服务器启动关闭序列并进入关闭模式。所有现有请求均已完成,不会受理任何新请求。当最后一个请求完成时,服务器将关闭所有连接并关闭。阅读更多

有关流程的更多信息请参见此处