Skip to main content

Що таке контролер в 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; } }

Ключові принципи контролерів

  1. Контролер - це шар маршрутизації. Він визначає, які методи викликаються при зверненні до конкретних URL.
  2. Мінімум логіки. Контролер не повинен вирішувати "що робити", а лише "кому передати".
  3. Ін'єкція залежностей. Контролер отримує сервіси через конструктор (constructor(private service: ServiceName)).
  4. Інкапсуляція. Кожен контролер зазвичай пов'язаний із конкретним модулем (наприклад, UsersController в UsersModule).

Приклад структури проєкту з контролером

javascript
src/ ├── users/ │ ├── users.controller.ts ← контролер │ ├── users.service.ts ← бізнес-логіка │ └── users.module.ts ← об'єднує обидва └── app.module.ts

Підсумок

ПоняттяОпис
КонтролерОбробляє запити й повертає відповіді
РольВхідна точка застосунку, що зв'язує зовнішній світ з логікою
Головний принципДелегує бізнес-логіку сервісам
ІнструментиHTTP-декоратори, DI, Guards, Interceptors, Pipes

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.