# Адриан: «Express — это хаос Дикого Запада, NestJS — порядок современного города»

Источник: https://www.youtube.com/watch?v=Q6NpiIp-6WM
Канал: JavaScript Mastery
Опубликовано: 26.06.2026

---

В современном мире веб-разработки Express долгое время оставался стандартом де-факто для Node.js, однако по мере роста команд и сложности проектов его гибкость начала превращаться в проблему. Ведущий канала JavaScript Mastery, Адриан, представляет масштабное руководство по NestJS — фреймворку, который превращает «дикий запад» бэкенда в структурированный мегаполис, и показывает, как современные ИИ-агенты меняют сам процесс написания кода.

## 🏙️ От «Дикого Запада» к современному городу: зачем нужен NestJS
[[JUMP:02:28]]

Адриан сравнивает разработку на Express с Диким Западом: разработчик получает чистый холст и полную свободу в выборе структуры папок и паттернов [02:28]. По мнению автора, для прототипов это отлично, но в больших командах такая свобода становится обузой: разработчики начинают тратить время не на фичи, а на споры о структуре проекта. В противовес этому, NestJS — это современный город с «законами зонирования».

NestJS не заменяет Express, а строится поверх него (или Fastify), добавляя строгую структуру [03:46]. Адриан выделяет три ключевых преимущества фреймворка:

*   **TypeScript «из коробки»:** Никаких сложных настроек Babel или Webpack.
*   **Инъекция зависимостей (Dependency Injection):** Паттерн, ставший стандартом в Java и C#, позволяет создавать слабосвязанный и легко тестируемый код [04:13].
*   **Декораторы:** Использование аннотаций типа `@Controller` или `@Get` позволяет коду «описывать то, что он делает, а не то, как он это делает» [04:39].

## 🧱 Архитектурные блоки: Модули, Контроллеры и Провайдеры
[[JUMP:08:18]]

Любое приложение NestJS строится вокруг модулей. Модуль группирует связанные контроллеры, сервисы и бизнес-логику одной фичи [08:26]. Адриан подчеркивает, что такая организация позволяет проектам масштабироваться без хаоса. Типичный рабочий процесс запроса выглядит так: запрос попадает в контроллер («рецепционист»), который передает его в сервис («работник в тылу») для выполнения тяжелой работы с базой данных или логикой [11:08].

### Контроллеры и DTO
[[JUMP:11:48]]

Контроллеры отвечают за обработку входящих HTTP-запросов. Вместо ручной регистрации маршрутов, как в Express, здесь используются декораторы методов (`@Get`, `@Post`, `@Delete`) [12:30]. Для обеспечения типизации данных на входе Адриан настоятельно рекомендует использовать DTO (Data Transfer Objects).

*   **DTO — это классы, а не интерфейсы:** В отличие от интерфейсов, классы сохраняются после компиляции TypeScript, что позволяет NestJS проводить валидацию данных в рантайме [18:31].
*   **Partial Type:** Для операций обновления (PATCH/PUT) используется специальная функция `PartialType`, которая делает все поля DTO создания необязательными, избавляя от дублирования кода [19:31].

## 💉 Магия Dependency Injection: Аналогия с пиццерией
[[JUMP:21:48]]

Чтобы объяснить концепцию инъекции зависимостей (DI), Адриан приводит аналогию с шеф-поваром [23:42]. Неправильный подход (плотная связность) — это когда повар для каждого заказа сам едет на ферму за помидорами. Если ферма закроется, повар не сможет работать.

Правильный подход в NestJS:

1.  Шеф-повар не покидает кухню.
2.  Поставщик (NestJS) доставляет помидоры (сервисы) прямо на кухню.
3.  Повару всё равно, откуда взялись помидоры, пока они соответствуют стандарту [24:07].

В коде это реализуется через конструктор контроллера: вы просто объявляете `private readonly userService: UserService`, и Nest сам создает экземпляр и «внедряет» его [24:36].

## 🛠️ Трубопровод выполнения: Middleware, Guards и Pipes
[[JUMP:33:21]]

NestJS предлагает четко определенный жизненный цикл запроса, состоящий из нескольких уровней:

*   **Interceptors (Перехватчики):** Работают до и после контроллера. Идеальны для трансформации ответа (например, приведения всех ответов к виду `{ status, message, data }`) [33:46].
*   **Pipes (Трубы):** Занимаются трансформацией и валидацией входных данных. Например, `ParseIntPipe` автоматически превратит строку из URL в число [38:53].
*   **Middleware (Посредники):** Выполняются в самом начале. По мнению Адриана, они «глухи» к контексту приложения и подходят только для логгирования или общих проверок [47:17].
*   **Guards (Стражи):** В отличие от Middleware, имеют доступ к контексту выполнения (знают, какой метод и контроллер вызывается). Это делает их идеальным инструментом для аутентификации и авторизации (проверки ролей) [47:59].

## 🤖 Agentic Development: Разработка в 2026 году
[[JUMP:52:01]]

В практической части видео Адриан демонстрирует подход, который он называет **Agentic Development** [52:22]. Вместо того чтобы писать каждую строку кода вручную, разработчик выступает в роли архитектора, управляя ИИ-агентом (например, Claude Code).

Ключевые инструменты этого воркфлоу:

1.  **MCP-серверы (Model Context Protocol):** Позволяют ИИ напрямую взаимодействовать с инструментами вроде Prisma или Arcjet [59:22].
2.  **JSM Skills:** Набор специализированных промптов и инструкций, которые обучают ИИ-агента лучшим практикам архитектуры NestJS [55:25].
3.  **Архитектурное планирование:** Прежде чем писать код, агент обязан составить план (`/architect`), который одобряет человек [57:35].

## 🛡️ Безопасность и Инфраструктура: Arcjet и Better Auth
[[JUMP:58:44]]

При создании реального API для хакатона Адриан делает ставку на современные облачные инструменты.

**Arcjet** используется для защиты приложения на уровне кода. С помощью интеграции через MCP агент сам создает сайт в панели Arcjet, получает ключи и настраивает:

*   **Shield:** Автоматическая защита от SQL-инъекций и XSS [59:49].
*   **Rate Limiting:** Ограничение количества запросов (например, 10 запросов в минуту для тестов), чтобы предотвратить спам [1:05:07].

**Better Auth** выбран как решение для аутентификации. Адриан подчеркивает важность использования ролей (Admin/Participant), которые жестко зафиксированы в базе и не могут быть изменены пользователем через API при регистрации [1:17:31]. Для управления базой данных используется **Prisma** с PostgreSQL, что позволяет визуализировать данные через Prisma Studio и быстро проводить миграции [1:07:43].

## 🚀 Финальный проект: API для хакатонов
[[JUMP:1:31:10]]

Итоговое приложение включает в себя:

1.  **Модуль пользователя:** С эндпоинтами для получения профиля и админским списком всех участников [1:23:02].
2.  **Модуль хакатона:** Позволяет админам создавать события, а участникам — записываться на них [1:31:49].
3.  **Валидация дат:** Реализована через `class-validator`, запрещающая создавать хакатоны в прошлом [1:39:28].
4.  **Логика записи:** Система проверяет, активен ли хакатон и не записывался ли пользователь ранее (уникальное ограничение на уровне БД), прежде чем создать запись [1:40:44].

Адриан заключает, что использование NestJS в сочетании с ИИ-агентами позволяет собирать «production-ready» бэкенды в разы быстрее, сохраняя при этом архитектурную чистоту, готовую к высоким нагрузкам [1:45:39].