Що таке контролер в NestJS?
Контролер (Controller) в NestJS - це клас, який відповідає за обробку вхідних запитів і формування відповідей клієнту.
Саме контролери визначають ендпоінти API (наприклад, /users, /auth/login) і зв'язують зовнішній світ (HTTP, WebSocket тощо) із внутрішньою логікою застосунку (сервісами, репозиторіями тощо).
Основна ідея
Контролер - це вхідна точка твого backend-застосунку. Він:
- приймає запит (HTTP, GraphQL, WebSocket);
- витягує параметри, тіло, заголовки тощо;
- викликає сервіси чи інші провайдери, де зберігається бізнес-логіка;
- повертає відповідь клієнту.
Контролери не повинні містити складну бізнес-логіку - вони делегують її сервісам.
Приклад простого контролера
javascript
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users') // усі маршрути починаються з /users
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get() // GET /users
findAll() {
return this.usersService.findAll();
}
@Get(':id') // GET /users/:id
findOne(@Param('id') id: string) {
return this.usersService.findOne(id);
}
@Post() // POST /users
create(@Body() body: { name: string; email: string }) {
return this.usersService.create(body);
}
}Як працюють маршрути
| Декоратор | HTTP метод | Приклад URL | Опис |
|---|---|---|---|
@Get() | GET | /users | Отримати дані |
@Post() | POST | /users | Створити новий запис |
@Put() | PUT | /users/:id | Повністю оновити запис |
@Patch() | PATCH | /users/:id | Частково оновити запис |
@Delete() | DELETE | /users/:id | Видалити запис |
Основні декоратори для контролерів
| Декоратор | Призначення |
|---|---|
@Controller('path') | Визначає базовий шлях для всіх маршрутів контролера |
@Get(), @Post(), @Put(), @Delete() | Визначають тип запиту |
@Param() | Витягує параметри з URL (/users/:id) |
@Body() | Витягує тіло запиту (JSON) |
@Query() | Витягує query-параметри (?page=2&limit=10) |
@Headers() | Доступ до заголовків запиту |
@Req() / @Res() | Доступ до об'єктів request і response (Express/Fastify) |
@HttpCode() | Явно задає статус відповіді |
@UseGuards() | Підключає guards (наприклад, автентифікацію) |
@UseInterceptors() | Перехоплює й змінює запит/відповідь |
Взаємодія контролера й сервісу
Контролер завжди звертається до сервісу, щоб не дублювати бізнес-логіку:
javascript
// users.service.ts
@Injectable()
export class UsersService {
private users = [{ id: 1, name: 'John' }];
findAll() {
return this.users;
}
findOne(id: string) {
return this.users.find(u => u.id === +id);
}
create(user) {
this.users.push({ id: Date.now(), ...user });
return user;
}
}Ключові принципи контролерів
- Контролер - це шар маршрутизації. Він визначає, які методи викликаються при зверненні до конкретних URL.
- Мінімум логіки. Контролер не повинен вирішувати "що робити", а лише "кому передати".
- Ін'єкція залежностей.
Контролер отримує сервіси через конструктор (
constructor(private service: ServiceName)). - Інкапсуляція.
Кожен контролер зазвичай пов'язаний із конкретним модулем (наприклад,
UsersControllerвUsersModule).
Приклад структури проєкту з контролером
javascript
src/
├── users/
│ ├── users.controller.ts ← контролер
│ ├── users.service.ts ← бізнес-логіка
│ └── users.module.ts ← об'єднує обидва
└── app.module.tsПідсумок
| Поняття | Опис |
|---|---|
| Контролер | Обробляє запити й повертає відповіді |
| Роль | Вхідна точка застосунку, що зв'язує зовнішній світ з логікою |
| Головний принцип | Делегує бізнес-логіку сервісам |
| Інструменти | HTTP-декоратори, DI, Guards, Interceptors, Pipes |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.