Проверяет понимание роли декораторов @Injectable и @Controller в Nest.js и их места в архитектуре приложения.
В Nest.js декораторы @Controller и @Injectable решают разные задачи, хотя оба связаны с механизмом метаданных и DI-контейнером. Понимание их различий важно для правильной организации слоёв приложения.
Декоратор @Controller применяется к классу, который отвечает за обработку входящих HTTP-запросов. Он определяет префикс маршрута и связывает методы класса с конкретными эндпоинтами через @Get, @Post и другие. Контроллер — это точка входа в приложение, он не содержит бизнес-логики, а делегирует её сервисам.
@Controller('users')
export class UsersController {
constructor(private usersService: UsersService) {}
@Get(':id')
findOne(@Param('id') id: string) {
return this.usersService.findById(id);
}
}Декоратор @Injectable помечает класс как провайдер, который может быть зарегистрирован в DI-контейнере Nest и внедрён в другие классы через конструктор. Это могут быть сервисы, репозитории, фабрики, стратегии и любые вспомогательные классы. Без @Injectable Nest не сможет разрешить зависимости этого класса.
@Injectable()
export class UsersService {
constructor(private repo: UsersRepository) {}
findById(id: string) {
return this.repo.findOne(id);
}
}На практике контроллер тоже может быть помечен @Injectable, но это не обязательно, так как Nest сам обрабатывает контроллеры. Однако сервис без @Injectable не будет корректно разрешён контейнером.
Итог: используйте @Controller для классов, обрабатывающих HTTP-запросы, и @Injectable для сервисов и других провайдеров, которые должны внедряться через DI. Это разделяет ответственность и делает архитектуру чище.