Skip to main content

Порядок middleware

1. Основна ідея

Express виконує middleware у тому порядку, у якому вони були зареєстровані в коді - зверху вниз.

Тобто порядок у твоєму файлі = порядок обробки запиту. Кожен middleware може:

  • обробити частину запиту;
  • змінити req чи res;
  • або завершити відповідь (res.send() / res.end()),
  • або передати виконання далі викликом next().

Приклад:

javascript
const express = require('express'); const app = express(); app.use((req, res, next) => { console.log('Перший middleware'); next(); }); app.use((req, res, next) => { console.log('Другий middleware'); next(); }); app.get('/', (req, res) => { console.log('Обробник маршруту'); res.send('Готово!'); }); app.listen(3000);

Вивід при GET /:

javascript
Перший middleware Другий middleware Обробник маршруту

2. Правило: "усе зверху вниз"

Express реєструє middleware в порядку, у якому вони написані:

  • app.use() - глобальні middleware;
  • app.get(), app.post() - маршрути;
  • app.use('/path', router) - вкладені маршрути;
  • app.use((err, req, res, next) => {...}) - обробник помилок (наприкінці!).

Якщо якийсь middleware не викликає next() і не завершує відповідь (res.send()), ланцюжок зупиняється.

Приклад: пропущений next()

javascript
app.use((req, res, next) => { console.log('1'); // next() забули! }); app.get('/', (req, res) => { console.log('2'); res.send('OK'); });

Результат: Express застрягне на першому middleware, тому що next() не викликано - другий обробник ніколи не виконається.

3. Middleware, прив'язані до шляхів

Ти можеш вказати, що middleware застосовується лише до певного шляху:

javascript
app.use('/admin', (req, res, next) => { console.log('Middleware для /admin'); next(); }); app.get('/admin', (req, res) => res.send('Адмін-панель')); app.get('/user', (req, res) => res.send('Профіль'));

При GET /admin виконується middleware → потім маршрут. При GET /user middleware для /admin пропускається.

4. Router і локальні middleware

Коли ти підключаєш маршрутизатор (express.Router()), усі middleware всередині нього виконуються у локальному контексті - але порядок між глобальними й локальними зберігається.

javascript
const router = express.Router(); router.use((req, res, next) => { console.log('Router middleware'); next(); }); router.get('/', (req, res) => res.send('Маршрут /api')); app.use((req, res, next) => { console.log('Глобальний middleware'); next(); }); app.use('/api', router);

При запиті /api:

javascript
Глобальний middleware Router middleware

5. Middleware для помилок виконуються останніми

Обробники помилок мають йти після всіх звичайних middleware й маршрутів. Express визначає їх за чотирма аргументами: (err, req, res, next)

javascript
app.use((err, req, res, next) => { console.error('Помилка:', err.message); res.status(500).send('Щось пішло не так'); });

Express викликає їх лише якщо ти передав помилку через next(err) чи всередині middleware виникло виключення.

6. Зведення порядку виконання

ЕтапЩо відбуваєтьсяПриклад
1Глобальні middleware (app.use)логування, парсинг JSON
2Middleware, прив'язані до шляхів (app.use('/path', ...))авторизація, кешування
3Middleware й маршрути в express.Router()API endpoints
4Конкретні обробники маршрутів (app.get, app.post)основний код
5Middleware для помилок (app.use(err, req, res, next))фінальна обробка помилок

7. Підсумок

Express визначає порядок виконання middleware у тому порядку, у якому вони зареєстровані в коді.

Правила:

  1. Виконання йде зверху вниз.
  2. Кожен middleware має викликати next(), щоб передати керування далі.
  3. Middleware може бути обмежений за шляхом (app.use('/admin', ...)).
  4. Обробники помилок (з 4 аргументами) виконуються останніми.
  5. Якщо middleware не викликає next() і не надсилає відповідь - запит "зависає".

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.