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.