Порядок middleware
1. Основна ідея
Express виконує middleware у тому порядку, у якому вони були зареєстровані в коді - зверху вниз.
Тобто порядок у твоєму файлі = порядок обробки запиту. Кожен middleware може:
- обробити частину запиту;
- змінити
reqчиres; - або завершити відповідь (
res.send()/res.end()), - або передати виконання далі викликом
next().
Приклад:
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 /:
Перший 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()
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 застосовується лише до певного шляху:
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 всередині нього виконуються у локальному контексті -
але порядок між глобальними й локальними зберігається.
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:
Глобальний middleware
Router middleware5. Middleware для помилок виконуються останніми
Обробники помилок мають йти після всіх звичайних middleware й маршрутів. Express визначає їх за чотирма аргументами:
(err, req, res, next)
app.use((err, req, res, next) => {
console.error('Помилка:', err.message);
res.status(500).send('Щось пішло не так');
});Express викликає їх лише якщо ти передав помилку через next(err)
чи всередині middleware виникло виключення.
6. Зведення порядку виконання
| Етап | Що відбувається | Приклад |
|---|---|---|
| 1 | Глобальні middleware (app.use) | логування, парсинг JSON |
| 2 | Middleware, прив'язані до шляхів (app.use('/path', ...)) | авторизація, кешування |
| 3 | Middleware й маршрути в express.Router() | API endpoints |
| 4 | Конкретні обробники маршрутів (app.get, app.post) | основний код |
| 5 | Middleware для помилок (app.use(err, req, res, next)) | фінальна обробка помилок |
7. Підсумок
Express визначає порядок виконання middleware у тому порядку, у якому вони зареєстровані в коді.
Правила:
- Виконання йде зверху вниз.
- Кожен middleware має викликати
next(), щоб передати керування далі.- Middleware може бути обмежений за шляхом (
app.use('/admin', ...)).- Обробники помилок (з 4 аргументами) виконуються останніми.
- Якщо middleware не викликає
next()і не надсилає відповідь - запит "зависає".
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.