Разработчики регулярно сталкиваются с необъяснимыми сбоями в Node.js-приложениях: запросы "зависают", падают без логов, сервер неожиданно перезагружается. В 80% моих аудитов корень проблемы — ошибки в асинхронной обработке ошибок. Рассмотрим токсичные паттерны и современные решения на реальных примерах из production.
Антипаттерн #1: Ghost Promise
app.post('/webhook', (req, res) => {
validateRequest(req);
processPaymentAsync(req.body) // Отсутствует обработка промиса
.then(result => sendNotification(result));
res.status(200).json({ received: true });
});
Клиент получает 200 OK, но что если processPaymentAsync
упадёт? Ошибка превращается в "зомби-промис", поглощаемый event loop. Сервер не упадёт, но процессорное время и память утекают сквозь пальцы. Добавьте обработку catch
или реальное ожидание: