Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке контролери в Express-застосунках?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Контролер - це функція (чи набір функцій), яка викликається при зверненні до конкретного маршруту: приймає `req`/`res`, викликає потрібні сервіси чи моделі, повертає клієнту відповідь і за потреби обробляє помилки через `next(err)`. **Ключове:** контролери відокремлюють маршрутизацію (`routes/`) від логіки обробки (`controllers/`), що робить код чистішим, тестованим окремо від Express і легко масштабованим по модулях (users, products, orders тощо).Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняЯкщо коротко: > **Контролер** - це місце, де відбувається основна логіка обробки запиту й формування відповіді клієнту. ## 1. Що таке контролер в Express В Express.js **контролер** - це **функція (чи набір функцій)**, яка викликається, коли користувач звертається до певного маршруту (`route`). Вона: - приймає об'єкти `req` (запит) і `res` (відповідь); - викликає потрібні сервіси, моделі чи бази даних; - повертає користувачу **відповідь (JSON, HTML, файл тощо)**; - за потреби - обробляє помилки. ### Приклад простого контролера ```javascript // controllers/userController.js exports.getAllUsers = async (req, res, next) => { try { const users = await User.find(); // звернення до моделі res.json(users); // відправка відповіді клієнту } catch (err) { next(err); // передача помилки в middleware } }; ``` І підключення цього контролера в маршруті: ```javascript // routes/users.js const express = require('express'); const router = express.Router(); const userController = require('../controllers/userController'); router.get('/', userController.getAllUsers); module.exports = router; ``` Тепер `GET /users` → викликає функцію `getAllUsers()` із контролера. ## 2. Що робить контролер | Етап | Що робить | |---|---| | Отримує дані | Читає параметри запиту: `req.params`, `req.query`, `req.body`, `req.headers` | | Викликає бізнес-логіку | Через сервіси чи моделі (робота з базою даних, перевірка умов, авторизація тощо) | | Формує відповідь | Надсилає клієнту `res.json()`, `res.status()`, `res.send()`, `res.redirect()` тощо | | Обробляє помилки | Через `try...catch` і `next(err)` для передачі в error middleware | ## 3. Навіщо потрібні контролери | Причина | Пояснення | |---|---| | Розділення обов'язків | Контролер займається обробкою запитів, а не маршрутизацією. | | Чистота коду | Код у `routes` лишається мінімальним і зрозумілим. | | Повторне використання | Один і той самий контролер можна підключити в різні маршрути чи проєкти. | | Спрощення тестування | Контролери можна тестувати незалежно від Express-застосунку. | | Масштабованість | Коли API росте, контролери можна розділити по модулях (users, products, orders…). | ## 4. Приклад структури Express-застосунку з контролерами ```javascript src/ ├── app.js ├── routes/ │ ├── users.js │ ├── products.js │ └── auth.js ├── controllers/ │ ├── userController.js │ ├── productController.js │ └── authController.js ├── services/ │ ├── userService.js │ └── productService.js ├── middlewares/ │ ├── authMiddleware.js │ └── errorHandler.js └── db/ └── index.js ``` Тут: - `routes/` - лише визначає шляхи (`/users`, `/products` тощо); - `controllers/` - містить функції, які виконуються при зверненні до цих маршрутів; - `services/` - містить бізнес-логіку (роботу з БД, API тощо). ## 5. Приклад контролера рівня продакшн ```javascript // controllers/productController.js const productService = require('../services/productService'); exports.createProduct = async (req, res, next) => { try { const product = await productService.create(req.body); res.status(201).json(product); } catch (err) { next(err); // централізована обробка помилок } }; exports.getProduct = async (req, res, next) => { try { const product = await productService.getById(req.params.id); if (!product) return res.status(404).json({ message: 'Not found' }); res.json(product); } catch (err) { next(err); } }; ``` ## 6. Підсумок > **Контролери** - це функції, які виконують основну роботу при обробці HTTP-запиту: > отримують дані від клієнта, викликають бізнес-логіку й повертають відповідь. Їхнє основне призначення: - відокремити **маршрути** від **логіки**; - зробити код **структурним, зрозумілим і масштабованим**; - дозволити **тестувати й перевикористовувати** обробники незалежно від Express.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.