intermediate

NestJS controllers

Держите controllers thin: связывайте transport concerns с DTOs, status codes, decorators и service calls.

Controllers обрабатывают входящие HTTP requests и возвращают responses. Должны быть thin: связывают transport (status codes, headers, DTOs) с service calls — без business rules в decorators.

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

  @Post()
  @HttpCode(201)
  create(@Body() dto: CreateUserDto) {
    return this.users.create(dto);
  }

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

Route decorators (`@Get`, `@Post`), param decorators (`@Body`, `@Param`, `@Query`) и `@HttpCode`/`@Header` декларативно выражают HTTP semantics. Return values сериализуются в JSON, если interceptors не трансформируют.

На интервью: обоснование thin controllers, custom decorators, versioning (`@Controller({ version: '1' })`) для эволюции API.

Типовые ошибки: fat controllers с доступом к DB, неверная семантика HTTP status, дублирование validation, которой владеют pipes.

Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.

Чеклист:

  • Inject services; controllers только transport.
  • DTOs и pipes на parameters.
  • Явные status codes где defaults вводят в заблуждение.
  • Ошибки — filters и domain exceptions.