process.on('unhandledRejection', (e) => {
  console.error('unhandled', e);
});
await Promise.allSettled(tasks);

线上服务偶尔整个进程消失,日志最后一条只留下 Error: read ECONNRESET,没有业务代码的堆栈,进程守护工具显示它被重启过一次。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,异步里的错误既没有被等待捕获,也没有挂接失败回调,新版本运行时默认把未处理的失败当成致命错误,直接结束整个进程。

「unhandledRejection 进程退出」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:在入口挂一个未处理失败的监听,把堆栈打出来;逐个检查异步调用有没有等待或者接住错误了;并发任务统一用聚合方法收结果,不要让它裸跑。

改完只确认一件事:同样的错误再出现时有完整堆栈,进程不再无故退出,日志也能对上。

作者 9823189