Как обрабатывать ошибки в асинхронном коде на Node.js?
Event Loop и асинхронность
Ошибки в асинхронном коде обрабатываются в зависимости от стиля: try/catch для await, .catch для промисов и событие error для потоков и эмиттеров.
Способы
async/await: оборачиваемawaitвtry/catch.- Promise:
.catch()в конце цепочки. - Колбэки в стиле Node.js: первый аргумент
err, его проверяют сразу. EventEmitter: без обработчика событияerrorпроцесс упадёт.
Глобальные ловушки
process.on('unhandledRejection', ...)— промис завершился ошибкой без обработчика. С Node.js 15 по умолчанию это валит процесс.process.on('uncaughtException', ...)— исключение, которое никто не поймал. Состояние процесса после него ненадёжно, поэтому разумно залогировать и корректно завершиться.
async function load(id) {
try {
return await fetchUser(id);
} catch (err) {
logger.error({ err, id }, 'load failed');
throw err; // не глотаем ошибку молча
}
}Коротко для собеседования
Ловите ошибки там, где умеете их обработать, и пробрасывайте остальные. Глобальные обработчики нужны для логирования и аккуратного завершения, а не для продолжения работы.