Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Порядок middleware». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Express виконує middleware в тому порядку, у якому вони були зареєстровані в коді - зверху вниз: глобальні `app.use()`, потім прив'язані до шляху, потім Router'и, потім конкретні обробники маршрутів, і насамкінець - обробники помилок (4 аргументи). **Ключове:** якщо middleware не викличе `next()` і не завершить відповідь, ланцюжок зупиниться і запит "зависне" - наступні обробники ніколи не виконаються.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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 | | 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 **у тому порядку, у якому вони зареєстровані в коді**. > > Правила: > > 1. Виконання йде **зверху вниз**. > 2. Кожен middleware має викликати `next()`, щоб передати керування далі. > 3. Middleware може бути **обмежений за шляхом** (`app.use('/admin', ...)`). > 4. **Обробники помилок** (з 4 аргументами) виконуються останніми. > 5. Якщо middleware не викликає `next()` і не надсилає відповідь - запит "зависає".Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.