NestJS
Экспресс-шпаргалка 20/20
- Nest строится вокруг модулей, контроллеров и провайдеров, что задает четкие bounded-context границы.
- DI-контейнер управляет lifecycle провайдеров и снижает связность через constructor injection и токены.
- Контроллеры только принимают/возвращают transport-данные, бизнес-логика должна жить в service/use-case слое.
- DTO +
ValidationPipeформируют входной контракт и отсекают некорректный payload до бизнес-логики. - Pipes валидируют/трансформируют, Guards авторизуют, Interceptors оборачивают flow, Filters нормализуют ошибки.
- Глобальный exception filter должен отдавать единый error contract с code/message/context/traceId.
- JWT+RBAC реализуют через strategy + guards + policy checks, а не только через одну role-проверку.
- Версионирование API делают URL/header/media-type подходом с deprecation policy и backward совместимостью.
- Конфиг в Nest делают через
ConfigModuleи схему валидации env (fail-fast при старте). - Слои
domain/app/infrastructureпозволяют менять transport/DB без переписывания доменной логики. - Работа с БД должна держать транзакционные границы в сервисе и не протекать в контроллеры.
- Тестирование в Nest: unit для логики, integration для модулей, e2e для критических API-потоков.
- Кэширование включают точечно на read-heavy эндпоинтах с TTL и явной инвалидацией.
- Observability: структурные логи, метрики latency/error-rate, трассировка и readiness probes.
- Очереди (BullMQ) выносят долгие задачи из request path и требуют idempotency + retry policy.
- Graceful shutdown обязан закрыть HTTP, DB и воркеры до завершения процесса.
- Circular dependencies лечат рефакторингом границ модулей,
forwardRefиспользуют как временный компромисс. - Microservices transport оправдан только при реальной сервисной границе и независимом масштабировании.
- Error contract для клиентов должен быть стабильным и одинаковым между всеми endpoint.
- Миграция Express -> Nest делается инкрементально по модулям с контрактной совместимостью и shadow-этапами.
1. Как устроена модульная архитектура в NestJS?
Теги: nestjs, backend, typescript
Сложность: Middle/Senior
Короткий ответ
NestJS строится вокруг модулей, контроллеров и провайдеров, что задает четкие границы ответственности.
Что сказать на интервью (30-60 секунд)
- Где это применяется: Критично для корпоративных backend сервисов с модульной архитектурой и строгими API-контрактами.
- Главный риск: Смешивание transport-слоя и бизнес-логики в Nest усложняет тестирование и эволюцию API.
- Как проверяете решение: Сверяю поведение по runbook: детектирование, mitigation и проверка восстановления после сбоя.
Мини-пример
@Injectable()
export class UsersService {
findAll() {
return [];
}
}
Углубление (2-3 минуты)
- Свяжите тему "Как устроена модульная архитектура в NestJS?" с одним production-сценарием и объясните, почему она влияет на результат.
- Разберите поведение системы под пиковым трафиком и деградацией внешних зависимостей.
- Сформулируйте ключевой trade-off и объясните, как решение масштабируется на уровне системы.
Типичные ошибки
- Держат тяжелую обработку в синхронном request path.
- Запускают изменения без наблюдаемости и runbook.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как поведение изменится под пиковым трафиком?
- Что вынесете в фон, чтобы не блокировать critical path?
- Какой trade-off на уровне архитектуры здесь самый критичный?
Что повторить
- Границы
Event Loop/I-O/CPU и backpressure. - Runbook деградации внешней зависимости.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
2. Что такое providers и как работает DI в Nest?
Теги: nestjs, backend, typescript
Сложность: Middle/Senior
Короткий ответ
Providers управляются DI-контейнером Nest и внедряются в классы через constructor injection.
Что сказать на интервью (30-60 секунд)
- Где это применяется: Критично для корпоративных backend сервисов с модульной архитектурой и строгими API-контрактами.
- Главный риск: Смешивание transport-слоя и бизнес-логики в Nest усложняет тестирование и эволюцию API.
- Как проверяете решение: Сверяю поведение по runbook: детектирование, mitigation и проверка восстановления после сбоя.
Мини-пример
@Injectable()
export class UsersService {
findAll() {
return [];
}
}
Углубление (2-3 минуты)
- Свяжите тему "Что такое providers и как работает DI в Nest?" с одним production-сценарием и объясните, почему она влияет на результат.
- Покажите, какие сигналы observability подтверждают устойчивость решения.
- Сформулируйте ключевой trade-off и объясните, как решение масштабируется на уровне системы.