Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить express.Router()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)`express.Router()` створює "міні-застосунок" (міні-інстанс Express), який уміє те саме, що й `app`, але слугує для групування маршрутів і middleware в окремі модулі, підключені через `app.use('/prefix', router)`. **Ключове:** Router підтримує все, що й `app` (middleware, маршрути, параметри, вкладені підмодулі), а middleware, зареєстрований через `router.use()`, застосовується лише до маршрутів цього конкретного Router, не впливаючи на решту застосунку.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Що робить `express.Router()` > `express.Router()` створює **"міні-застосунок"** (міні-інстанс Express), > який уміє працювати так само, як `app`, але слугує **для групування маршрутів і middleware**. Ідея: замість того щоб описувати всі маршрути в `app.js`, можна розділити їх по файлах і імпортувати в основний застосунок. ### Приклад без Router (усе в одному файлі): ```javascript const express = require('express'); const app = express(); app.get('/users', (req, res) => res.send('Список користувачів')); app.get('/products', (req, res) => res.send('Список товарів')); app.listen(3000); ``` Мінус: код швидко стає громіздким. ## 2. Приклад із використанням `express.Router()` Створюємо два окремих файли для маршрутів: ### routes/users.js ```javascript const express = require('express'); const router = express.Router(); router.get('/', (req, res) => { res.send('Список користувачів'); }); router.get('/:id', (req, res) => { res.send(`Користувач з ID: ${req.params.id}`); }); module.exports = router; ``` ### routes/products.js ```javascript const express = require('express'); const router = express.Router(); router.get('/', (req, res) => { res.send('Список товарів'); }); router.post('/', (req, res) => { res.send('Товар створено'); }); module.exports = router; ``` ### app.js ```javascript const express = require('express'); const app = express(); const usersRouter = require('./routes/users'); const productsRouter = require('./routes/products'); // Підключаємо маршрутизатори з префіксом app.use('/users', usersRouter); app.use('/products', productsRouter); app.listen(3000, () => console.log('Сервер запущено')); ``` Тепер: - `GET /users` → "Список користувачів" - `GET /users/42` → "Користувач з ID: 42" - `GET /products` → "Список товарів" - `POST /products` → "Товар створено" ## 3. Як працює `Router` всередині Кожен `Router` - це **екземпляр middleware**, який містить у собі набір маршрутів і проміжних обробників. Коли Express отримує запит: 1. Він перевіряє, чи відповідає шлях (`/users`, `/products` тощо). 2. Якщо збігається - запит передається **внутрішньому Router**, де виконується свій власний "міні Event Loop" маршрутів і middleware. ## 4. Router підтримує все, що й `app` | Можливість | Працює в Router? | Приклад | |---|---|---| | Middleware | Так | `router.use(authMiddleware)` | | Маршрути | Так | `router.get('/', handler)` | | Параметри | Так | `router.param('id', callback)` | | Підмодулі Router | Так | `router.use('/admin', adminRouter)` | ## 5. Навіщо використовувати Router - переваги | Перевага | Пояснення | |---|---| | Модульність | Можна розділити застосунок на логічні частини (користувачі, товари, замовлення тощо) | | Перевикористання | Один Router можна підключити до різних застосунків | | Читабельність і структура | Код стає чистим, легким для навігації | | Локальні middleware | Можна застосовувати middleware лише до конкретної групи маршрутів | | Тестованість | Спрощує написання unit-тестів для окремих модулів API | ## 6. Приклад: middleware лише для одного Router ```javascript const router = express.Router(); function authMiddleware(req, res, next) { if (req.headers.token === '123') next(); else res.status(401).send('Немає доступу'); } router.use(authMiddleware); // застосовується лише до маршрутів цього Router router.get('/secret', (req, res) => { res.send('Секретна зона'); }); module.exports = router; ``` Тепер перевірка авторизації застосовується **лише** до `/secret`, і не впливає на інші частини застосунку. ## 7. Підсумок > `express.Router()` - це міні-застосунок Express, > який дозволяє групувати маршрути й middleware для певної частини API. > > Використовується для: > > - організації коду (розділення по модулях); > - підключення префіксів (`app.use('/api/users', usersRouter)`); > - додавання локальних middleware; > - спрощення підтримки й тестування. > > Майже будь-який великий Express-застосунок побудований на `Router()`.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.