Урок 01

Введение в NestJS

Что такое NestJS

NestJS — прогрессивный фреймворк для Node.js на TypeScript. Вдохновлён Angular и Spring.

Что даёт:

  • Строгая архитектура — модули, контроллеры, сервисы.
  • DI-контейнер — из коробки.
  • TypeScript-first — типы везде.
  • Декораторы — понятный синтаксис.
  • Готовые интеграции — TypeORM, Prisma, GraphQL, WebSocket.

Зачем NestJS

Проблема Express/Fastify:

  • Нет структуры — каждый проект уникален.
  • Ручное внедрение зависимостей.
  • Сложно масштабировать команду.

NestJS даёт:

  • Единый стиль — любой проект на NestJS похож.
  • DI — как в Spring/Angular.
  • Модульность — изолированные куски.
  • Тестируемость — мокать легко.
  • Документация Swagger — из коробки.

Сравнение с другими

ExpressFastifyNestJS
СтруктураНетНетЕсть
DIНетНетЕсть
TypeScriptОпциональноОпциональноОбязательно
СкоростьСредняяВысокаяВысокая
Кривая обученияНизкаяНизкаяВысокая

NestJS под капотом использует Express или Fastify — можно переключать.

Основные концепции

Три кита NestJS:

  1. Модули (@Module) — группировка.
  2. Контроллеры (@Controller) — HTTP-роуты.
  3. Сервисы (@Injectable) — бизнес-логика.

Первый пример

Контроллер:

import { Controller, Get } from '@nestjs/common';

@Controller('users')
export class UsersController {
    @Get()
    findAll(): string {
        return 'Список пользователей';
    }
}

@Controller('users') — префикс /users.

@Get() — метод GET /users.

Модуль

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
    controllers: [UsersController],
    providers: [UsersService],
})
export class UsersModule {}

Модуль связывает контроллеры и сервисы.

Сервис

import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
    private users = [{ id: 1, name: 'Иван' }];

    findAll() {
        return this.users;
    }
}

@Injectable() — может быть внедрён в другие классы.

Точка входа

src/main.ts:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
    const app = await NestFactory.create(AppModule);
    await app.listen(3000);
}

bootstrap();

NestFactory — создаёт приложение.

Корневой модуль

src/app.module.ts:

import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';

@Module({
    imports: [UsersModule],
})
export class AppModule {}

Всё начинается с корневого модуля.

Установка

CLI:

npm install -g @nestjs/cli
nest new my-app

Или через npx:

npx @nestjs/cli new my-app

Выбрать npm / yarn / pnpm.

Структура проекта

my-app/
├── src/
│   ├── main.ts             # точка входа
│   ├── app.module.ts       # корневой модуль
│   ├── app.controller.ts
│   └── app.service.ts
├── test/
├── package.json
├── tsconfig.json
└── nest-cli.json

Команды CLI

nest new my-app              # создать проект
nest generate module users   # создать модуль
nest generate controller users
nest generate service users
nest generate resource users  # всё сразу + CRUD
nest start                   # запустить
nest start --watch           # с перезагрузкой
nest build                   # собрать
nest test                    # тесты

Сокращения:

nest g module users
nest g controller users
nest g service users
nest g resource users

Структура модуля

nest g resource users создаёт:

src/users/
├── dto/
│   ├── create-user.dto.ts
│   └── update-user.dto.ts
├── entities/
│   └── user.entity.ts
├── users.controller.ts
├── users.service.ts
└── users.module.ts

Полный CRUD — одна команда.

Плюсы NestJS

  • Единая архитектура — любой проект похож.
  • TypeScript-first — типы везде.
  • DI — как в серьёзных фреймворках.
  • Модули — можно выделить в пакеты.
  • Тестируемость — unit + e2e.
  • Swagger — автодокументация.
  • Микросервисы — из коробки.

Минусы

  • Кривая обучения — декораторы, DI, модули.
  • Boilerplate — много файлов.
  • Overhead для маленьких проектов.
  • Магия — сложно отлаживать без понимания.

Когда использовать

NestJS — если:

  • Средний/крупный проект.
  • Команда — нужен единый стиль.
  • Микросервисы.
  • Enterprise.
  • GraphQL, WebSocket, очереди.

Express/Fastify — если:

  • Маленький API.
  • Прототип.
  • Скрипт, лямбда.
  • Полный контроль над стеком.

Что дальше

  1. Установка и первый проект
  2. Модули
  3. Контроллеры
  4. Сервисы и DI
  5. DTO и валидация
  6. Pipes, Guards, Interceptors
  7. Работа с БД (TypeORM/Prisma)
  8. Аутентификация JWT
  9. Конфигурация
  10. Тестирование
  11. Swagger и документация
  12. Деплой

Итог

  • NestJS — TypeScript-фреймворк.
  • Angular + Spring вдохновение.
  • Модули, контроллеры, сервисы — основа.
  • DI — из коробки.
  • CLI — генерирует код.
  • Для крупных проектов — идеально.

Дальше — установка и первый проект.