【问题标题】:Nodejs process crashing even with process.on(uncaughtException)即使使用 process.on(uncaughtException),Nodejs 进程也会崩溃
【发布时间】:2021-10-27 15:19:38
【问题描述】:

我正在使用 openode.io 来托管 nodejs 应用程序。我正在它上面运行一个多人服务器。有时,由于滞后或用户断开连接,进程会发出未捕获的错误并崩溃。我已经修复了其中的一些错误,但是在任何时候,如果用户发送无效数据,我的进程就会崩溃。我研究了如何防止这种情况并让 Sentry 记录错误,并在 nodejs 进程的开头使用以下代码来防止崩溃:

// prevent crashes
process.on('unhandledRejection', (reason, p) => {
  logger.info(reason + ' => Unhandled Rejection at Promise: ' + p);
  logger.info('!!!FATAL!!!')
})
process.on('uncaughtException', err => {
  logger.info(err + ' => Uncaught Exception thrown');
  logger.info('!!!FATAL!!!');
});

我决定使用我的服务器上发生的常见错误进行测试。

TypeError: Cannot set property 'canTakeThermalDamage' of undefined
  File "/opt/app/server.js", line 579, col 45, in Timeout._onTimeout
    host.pt[l].canTakeThermalDamage = true;
  File "internal/timers.js", line 559, col 11, in listOnTimeout
  File "internal/timers.js", line 500, col 7, in processTimers

这个错误不应该导致进程崩溃,但它确实发生了。由于这种情况发生在多人服务器上,因此它上的每个用户都会断开连接并必须重新登录。 以下是有关错误的哨兵日志: 当这个错误发生时,process.on里面的代码运行了,但是进程还是崩溃了? Sentry 是否因为发现错误而使其崩溃?错误是由setTimeout引起的吗?还是有其他原因?

【问题讨论】:

    标签: node.js crash


    【解决方案1】:

    无论如何,该过程将退出。它只是为您提供了一些清理选项。

    默认情况下,Node.js 通过将堆栈跟踪打印到 stderr 并使用代码 1 退出来处理此类异常

    当您添加自己的处理程序时(这是您的情况):

    或者,更改“uncaughtException”处理程序中的 process.exitCode,这将导致进程以提供的退出代码退出。否则,在存在此类处理程序的情况下,该进程将以 0 退出。 您可以为unhandledRejection 注册一个监听器,以便在退出前进行一些清理。

    Read more

    • 您应该修复代码以不引发异常或使用 try catch 正确处理异常
    • 如果您想让uncaughtException 处理程序始终使用process.exit(1) 退出进程,除非您有充分的理由不这样做

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多