Error middleware

Тема дорожной карты · Node.js

Middleware для обработки ошибок в Express.js — это специальный тип middleware-функции, принимающей четыре аргумента — err, req, res и next — и отвечающей за перехват и обработку ошибок, возникающих в любом месте конвейера обработки запросов сервера. В отличие от обычного middleware, обработчик ошибок должен регистрироваться после всех маршрутов, чтобы Express.js мог передавать ему необработанные ошибки через вызов next(err). Хорошо спроектированный уровень обработки ошибок отправляет соответствующий HTTP-код статуса и единообразный JSON-ответ с информацией об ошибке, не допуская утечки «сырых» трассировок стека клиентам. Разработчики Node.js, как правило, определяют единое централизованное middleware для обработки ошибок в конце приложения Express.js, чтобы нормализовать ошибки из асинхронных обработчиков маршрутов, ошибки валидации и исключения базы данных. Правильно реализованное middleware для обработки ошибок делает API на Node.js более надёжными и простыми для отладки в продакшне.

Как это работает

Error middleware — самый широко используемый Node HTTP-фреймворк: минималистичный, middleware-based, route-based. Запрос проходит через стек middleware-функций; каждая зовёт next() для передачи управления. app.get("/path", handler) регистрирует роут; app.use(middleware) монтирует middleware. Современные альтернативы: Fastify (быстрее, schema-based, JSON-first), Koa (духовный преемник Express, async-native), Hono (edge-runtime ready), NestJS (opinionated, decorator-based).

Когда применять

Express — для legacy-сервисов и быстрых прототипов; его доки и middleware-экосистема непревзойдены. Fastify — для новых performance-чувствительных API (2-3x throughput, встроенная schema-валидация). NestJS — для больших командных проектов с пользой от конвенций. Всегда добавляйте helmet, rate-limit, лимит размера body — у Express нет безопасных дефолтов. Валидируйте input (zod, ajv) до любой записи в БД.

Типичные ошибки

Ловушки Error middleware: забытый response — запрос висит вечно (ставьте timeouts); express.json({limit: "100mb"}) (DoS-вектор); нет глобального error-handler (app.use((err, req, res, next) => ...)); не выставлен app.disable("x-powered-by") (fingerprinting); баги в порядке middleware (auth должен быть до handler). Прочтите Express security best practices один раз.

Связанные понятия

Полезные ресурсы