Що робить express.Router()?
1. Що робить express.Router()
express.Router()створює "міні-застосунок" (міні-інстанс Express), який уміє працювати так само, якapp, але слугує для групування маршрутів і middleware.
Ідея:
замість того щоб описувати всі маршрути в app.js,
можна розділити їх по файлах і імпортувати в основний застосунок.
Приклад без Router (усе в одному файлі):
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
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
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
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 отримує запит:
- Він перевіряє, чи відповідає шлях (
/users,/productsтощо). - Якщо збігається - запит передається внутрішньому 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
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().
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.