Коротка відповідь
juniorMiddleware — це функція, що отримує запит (request) і відповідь (response), виконує логіку між прийомом та обробкою, а потім передає контроль далі. У Node.js це часто функція з підписом (req, res, next).
Повне пояснення
Що це і навіщо Middleware — проміжний шар у обробці HTTP‑запитів. Він дозволяє виконувати повторювані задачі (логування, аутентифікація, парсинг JSON, CORS) перед досягненням кінцевого маршруту.
Ключові принципи
- Підпис:
(req, res, next)абоasync (req, res, next). - Переходить до наступного middleware через виклик
next()або повертає відповідь. - Може бути глобальним (app.use) або прив’язаним до конкретного маршруту.
Як це працює
- Запит надходить до роутера.
- Express/ NestJS виконує middleware у порядку реєстрації.
- Кожен middleware може змінювати
req/res, виконувати асинхронні операції, або завершити цикл. - Якщо
next()не викликано, обробка зупиняється.
Практика і реалізація (Node.js / Express)
// логування
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
});
// аутентифікація
app.use('/api', (req, res, next) => {
if (!req.headers.authorization) return res.status(401).end();
next();
});
Тестування (Jest + supertest)
const request = require('supertest');
const app = require('./app');
test('unauthenticated request', async () => {
const res = await request(app).get('/api/secret');
expect(res.statusCode).toBe(401);
});
Безпека
- Перевірка заголовків, токенів.
- Обмеження кількості запитів (rate‑limiting).
- CORS‑middleware.
Особливості в контексті NestJS
- Middleware реалізується як клас, що імплементує
NestMiddleware. - Додається через
configure(consumer: MiddlewareConsumer).
Оптимізація
- Уникайте зайвих async/await у middleware, що не потребують асинхронності.
- Використовуйте
next('route')для пропуску до наступного маршруту.
Часті помилки
- Забутий
next()→ блокування. - Синхронний код, що блокує event‑loop → затримки.
- Неправильний порядок middleware → неправильна логіка.
- Перевантаження глобальним middleware → збільшена латентність.
- Необроблені помилки в async‑middleware → 500‑статус.
- Відсутність CORS у API, що викликається з браузера → 403.
- Неправильне використання
app.use('/path', middleware)→ не застосовується до підшляху. - Перевірка токену без
try/catch→ сервер падає.
Cheatsheet
app.use(middleware)– глобально.router.use(path, middleware)– прив’язано до шляху.next()– продовжити.next('route')– пропустити до наступного маршруту.app.use(errorHandler)– глобальний error‑handler (параметри: err, req, res, next).