← Назад к вопросам

Для чего используются контроллеры в Nest.js?

1.8 Middle🔥 191 комментариев
#TypeScript#Фреймворки и библиотеки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Контроллеры в Nest.js

Контроллеры — это класс, который обрабатывает входящие HTTP-запросы и отправляет HTTP-ответы. Это первый уровень обработки запроса, который маршрутизирует данные в соответствующие сервисы для обработки бизнес-логики.

Основная роль контроллеров

  1. Маршрутизация запросов — определяет какой HTTP метод (GET, POST, PUT, DELETE) соответствует какому методу класса
  2. Валидация входных данных — проверяет корректность query параметров, body, headers
  3. Преобразование данных — конвертирует пришедшие данные в нужный формат
  4. Вызов сервисов — делегирует бизнес-логику в Service слой
  5. Форматирование ответа — готовит Response в нужном формате для клиента

Структура контроллера

import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';

@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.usersService.findOne(id);
  }

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }
}

Декораторы в контроллерах

@Controller('путь') — определяет префикс маршрута для всех методов

@Controller('api/v1/users')
export class UsersController {}

Методы HTTP:

  • GET запрос: @Get()
  • POST запрос: @Post()
  • PUT запрос: @Put()
  • DELETE запрос: @Delete()
  • PATCH запрос: @Patch()

Извлечение данных:

  • @Param('id') — параметр из URL пути
  • @Query() — query параметры
  • @Body() — JSON тело запроса
  • @Headers() — HTTP заголовки

Архитектурные слои

Client -> Controller -> Service -> Repository -> Database

Практический пример

@Controller('posts')
export class PostsController {
  constructor(private postsService: PostsService) {}

  @Post()
  async create(@Body() createPostDto: CreatePostDto) {
    if (!createPostDto.title) {
      throw new BadRequestException('Заголовок обязателен');
    }
    return this.postsService.create(createPostDto);
  }
}

Почему разделение на Controller и Service?

  1. Single Responsibility — контроллер для HTTP, сервис для логики
  2. Тестируемость — сервис легко тестировать без HTTP
  3. Переиспользование — один сервис в разных контроллерах
  4. Масштабируемость — легче добавлять новые endpoints

Контроллеры — это входная точка всех API запросов, их задача переносить данные между HTTP и бизнес-логикой.