【发布时间】: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引起的吗?还是有其他原因?
【问题讨论】: