intermediate
Middleware
Комбинируйте request handlers для cross-cutting concerns, контролируя order, ownership, short-circuiting и side effects.
Middleware оборачивает обработку запроса с сигнатурой `(req, res, next)` (стиль Express) или через хуки фреймворка — cross-cutting поведение в явном порядке.
app.use(requestId());
app.use(express.json({ limit: '1mb' }));
app.use(authenticate);
app.get('/orders/:id', authorize('orders:read'), getOrder);
function asyncHandler(fn) {
return (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next);
}
Порядок важен: парсинг body до validation; auth до authorization; error middleware последним (handler с 4 аргументами). Short-circuit — ответ без `next()`.
Fastify hooks, Koa onion — разный API, тот же вопрос: кто владеет side effects и ошибками.
На интервью: порядок auth + validation; передача ошибок в центральный handler; global vs route-scoped.
Типовые ошибки: `next()` после отправки ответа; async без проброса ошибки; «божественный» middleware на все маршруты.
Чеклист:
- Одна ответственность на middleware.
- Задокументированный порядок.
- Единый формат ошибок.
- Осторожно с mutable полями на `req`.