# NestJS: архитектура, создание API и профессиональные приемы

Источник: https://www.youtube.com/watch?v=21_I-12f5JE
Канал: freeCodeCamp.org
Опубликовано: 02.12.2025

---

## 🚀 Введение в NestJS: создание серверных приложений
[[JUMP:0:00]]

NestJS — это прогрессивный фреймворк для Node.js, предназначенный для создания масштабируемых и поддерживаемых серверных приложений на TypeScript. По мнению автора курса, разработчика по имени Дон, NestJS предлагает более структурированный и надежный подход по сравнению с базовыми приложениями на Express. Фреймворк использует модульную архитектуру, систему внедрения зависимостей (Dependency Injection) и декораторы, что делает код чистым и тестируемым. В данном руководстве рассматривается процесс создания функционала профилей для дейтинг-приложения Dev Match, охватывающий все основные аспекты работы с NestJS: от настройки проекта до обработки ошибок и валидации данных.

---

## 🏗️ Начало работы и архитектура проекта
[[JUMP:5:16]]

Для быстрой настройки проекта рекомендуется использовать официальный интерфейс командной строки (CLI) NestJS, который автоматически создает правильную структуру каталогов и обеспечивает лучшие практики кодирования.

*   **Инициализация:** Команда CLI создает новый проект, настраивает TypeScript и устанавливает необходимые зависимости.
*   **Модульность:** В NestJS приложения организованы по модулям, которые позволяют разграничивать функционал (например, модуль профилей) и поддерживать чистоту кода.
*   **Контроллеры:** Отвечают за обработку входящих HTTP-запросов и делегирование логики сервисным слоям.
*   **Декораторы:** Это метаданные, которые добавляют поведение функциям или классам. В NestJS они широко используются для маршрутизации и настройки компонентов.

---

## 🛠️ Работа с HTTP-запросами: контроллеры и DTO
[[JUMP:10:16]]

Контроллеры определяют маршруты API, используя декораторы методов, такие как `@Get()`, `@Post()`, `@Put()` и `@Delete()`. Для передачи данных между клиентом и сервером используются объекты передачи данных (Data Transfer Objects, DTO).

*   **DTO (Data Transfer Object):** Это классы, описывающие «форму» данных, которую ожидает эндпоинт. Использование классов вместо интерфейсов позволяет NestJS использовать метаданные во время выполнения, что важно для валидации.
*   **Обработка параметров:** NestJS позволяет легко извлекать параметры запроса через декораторы `@Query()` (для параметров строки запроса) и `@Param()` (для параметров пути).
*   **Коды ответов:** По умолчанию контроллеры возвращают статус 200, однако для определенных операций (например, создание — 201, отсутствие контента — 204) можно использовать декоратор `@HttpCode()`.

---

## ⚙️ Бизнес-логика: сервисный слой
[[JUMP:29:36]]

Сервисы — это провайдеры, в которых сосредоточена основная бизнес-логика приложения. Они помечаются декоратором `@Injectable()`, что позволяет внедрять их в контроллеры или другие сервисы с помощью системы Dependency Injection.

*   **Разделение ответственности:** Контроллер лишь принимает запрос и вызывает метод сервиса, который отвечает за хранение и поиск данных.
*   **Инъекция зависимостей:** NestJS автоматически управляет созданием экземпляров сервисов, что избавляет разработчика от ручного создания объектов.

---

## 🛡️ Обработка ошибок и валидация
[[JUMP:55:16]]

Надежное API должно корректно обрабатывать исключительные ситуации. NestJS предоставляет встроенную систему обработки ошибок, которая перехватывает исключения и возвращает клиенту адекватные ответы.

*   **HTTP Exception:** При ошибках (например, профиль не найден) можно выбрасывать специальные исключения, такие как `NotFoundException`, которые автоматически трансформируются в 404 статус.
*   **Pipes:** Трубы (pipes) используются для трансформации данных (например, приведение строки к формату UUID) и валидации.
*   **Валидация:** С библиотеками `class-validator` и `class-transformer` можно добавлять декораторы (например, `@MinLength()`) к свойствам DTO для автоматической проверки входных данных.
*   **Guards:** Стражи (guards) используются для контроля доступа (авторизации) и определяют, разрешено ли выполнение конкретного запроса.