Node.js 14 trở về trước chỉ in cảnh báo rồi chạy tiếp — lỗi bị nuốt mất mà không ai hay. Từ Node.js 15 mặc định process crash với exit code 1, đây là breaking change.
Thứ tự xử lý đúng: try/catch trong async function là chính, .catch() cho promise fire-and-forget, còn handler cấp process chỉ là lưới an toàn cuối cùng chứ không phải cơ chế chính.
js
process.on('unhandledRejection', (reason) => {
Sentry.captureException(reason)
logger.error('Unhandled rejection', reason)
gracefulShutdown(1)
})
process.on('uncaughtException', (err) => {
logger.error(err)
gracefulShutdown(1)
})- Gửi lỗi lên Sentry rồi
await Sentry.flush(2000)trước khi thoát, nếu không sự kiện chưa kịp bay đi. - Graceful shutdown: ngừng nhận request mới, chờ request đang chạy, đóng DB, rồi exit.
Lưu ý: bật ESLint rule @typescript-eslint/no-floating-promises để bắt thiếu await ngay lúc compile — tốt hơn nhiều so với phát hiện lúc chạy.