Для большинства наших проектов бэкенд — это NestJS. Не потому что «модно», а потому что фреймворк даёт структуру, которую понимают все в команде: модули, контроллеры, сервисы, guards, pipes. На длинной дистанции это дешевле, чем свободный Express, где каждый разработчик изобретает свою архитектуру.
Что получаем из коробки
Dependency Injection, валидация через class-validator, Swagger через декораторы, интеграция с Bull для очередей, Passport для auth. TypeScript — не опция, а стандарт: контракты DTO ловят ошибки на этапе компиляции, а не в проде в три ночи.
@Controller('invoices')
export class InvoicesController {
constructor(private readonly invoices: InvoicesService) {}
@Post()
create(@Body() dto: CreateInvoiceDto) {
return this.invoices.create(dto);
}
}Модули и границы домена
Делим приложение на доменные модули: billing, users, notifications. Каждый экспортирует только публичный сервисный API, внутренние детали скрыты. Так проще выносить модуль в отдельный микросервис, когда проект вырастает — границы уже нарисованы.
NestJS не убирает сложность — он делает её видимой и управляемой.
Связка NestJS + Prisma (или TypeORM) + PostgreSQL закрывает 90% задач: REST/GraphQL API, фоновые джобы, webhooks, интеграции с внешними сервисами. Для high-load участков добавляем Redis и горизонтальное масштабирование воркеров — без смены стека.