Nest.js: современный backend-фреймворк для Node.js

NestJS

Привет! В предыдущей статье мы разобрали основы React, но полноценное веб-приложение невозможно без надежной серверной части. Сегодня поговорим о Nest.js — фреймворке, который меняет подход к backend-разработке на Node.js, делая её структурированной, масштабируемой и поддерживаемой.

Что такое Nest.js и почему он выделяется

Nest.js — это progressive framework для создания эффективных и масштабируемых серверных приложений на Node.js. Он построен на TypeScript и сочетает в себе элементы объектно-ориентированного программирования, функционального программирования и функционального реактивного программирования.

Фреймворк появился в 2017 году и быстро набрал популярность благодаря своей структурированной архитектуре. На сегодняшний день у проекта более 75 тысяч звезд на GitHub, а его активно используют компании Microsoft, Roche, Adidas и многие другие крупные организации.

Главная особенность Nest.js — он предоставляет готовую архитектуру приложения "из коробки". В отличие от Express.js, который дает полную свободу в организации кода, Nest.js предлагает четкую структуру с модулями, контроллерами, сервисами и провайдерами. Это делает код более предсказуемым и удобным для командной разработки.

Архитектура на основе модулей

Основной строительный блок в Nest.js — модуль. Модуль представляет собой класс, украшенный декоратором @Module(), который группирует связанные компоненты вместе. Каждый модуль может содержать контроллеры, провайдеры (сервисы), импорты других модулей и экспортируемые провайдеры.

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

@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],
})

export class UsersModule {}

Модульная архитектура позволяет легко масштабировать приложение, разделяя его на независимые части. Это особенно важно для больших проектов с множеством функций и логики.

Контроллеры и маршрутизация

Контроллеры отвечают за обработку входящих запросов и возврат ответов клиенту. Они украшены декоратором @Controller(), который указывает путь к контроллеру. Каждый метод внутри контроллера может быть украшен декораторами HTTP-методов: @Get(), @Post(), @Put(), @Delete() и другими.

import { Controller, Get, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }
}

Контроллеры получат зависимости через конструктор, что является частью системы внедрения зависимостей Nest.js. Это делает код более тестируемым и поддерживаемым.

Внедрение зависимостей

Система внедрения зависимостей (Dependency Injection) — одна из ключевых особенностей Nest.js. Она позволяет легко управлять зависимостями между классами и делает код более модульным и тестируемым.

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

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

@Injectable()
export class UsersService {
  private users = [];

  findAll() {
    return this.users;
  }

  create(user) {
    this.users.push(user);
    return user;
  }
}

DI-контейнер Nest.js автоматически создает экземпляры классов и внедряет зависимости там, где это необходимо. Это упрощает тестирование: вы можете легко заменить реальные зависимости на моки.

Преимущества перед Express.js

Express.js — отличный выбор для небольших проектов, но Nest.js предоставляет дополнительные возможности для создания масштабируемых приложений. Основные преимущества:

  • Структурированная архитектура: Nest.js предлагает четкую структуру с модулями, контроллерами и сервисами, что упрощает поддержку кода в больших проектах.
  • TypeScript из коробки: Хотя Nest.js поддерживает JavaScript, TypeScript используется по умолчанию, что дает статическую типизацию и лучшую поддержку IDE.
  • Мощная система модулей: Возможность легко организовать код в модули и переиспользовать их в разных частях приложения.
  • Поддержка микросервисов: Nest.js имеет встроенную поддержку для создания микросервисной архитектуры с транспортом TCP, Redis, NATS и другими.
  • GraphQL поддержка: Интеграция с GraphQL для создания более гибких API.
  • WebSockets: Встроенная поддержка для работы с WebSockets через @nestjs/platform-socket.io.
  • Команда консоли: Возможность создавать CLI-команды для автоматизации задач.

Пример создания REST API

Давайте создадим простой REST API для управления пользователями. Сначала установим Nest.js CLI и создадим новый проект:

npm install -g @nestjs/cli
nest new users-api
cd users-api

Создадим модуль для управления пользователями:

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

Обновим сервис для работы с данными:

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

interface User {
  id: number;
  name: string;
  email: string;
}

@Injectable()
export class UsersService {
  private users: User[] = [
    { id: 1, name: 'Иван Иванов', email: 'ivan@example.com' },
    { id: 2, name: 'Мария Петрова', email: 'maria@example.com' },
  ];

  findAll(): User[] {
    return this.users;
  }

  findOne(id: number): User {
    const user = this.users.find(u => u.id === id);

    if (!user) {
      throw new NotFoundException(`Пользователь с ID ${id} не найден`);
    }

    return user;
  }

  create(userData: Omit<User, 'id'>): User {
    const newUser: User = {
      id: this.users.length + 1,
      ...userData,
    };

    this.users.push(newUser);
    return newUser;
  }
}

Обновим контроллер для обработки HTTP-запросов:

import { Controller, Get, Post, Body, Param, HttpCode, HttpStatus } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.usersService.findOne(+id);
  }

  @Post()
  @HttpCode(HttpStatus.CREATED)
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }
}

Создадим DTO для валидации входных данных:

export class CreateUserDto {
  name: string;
  email: string;
}

Теперь можно запустить приложение:

npm run start

API будет доступен по адресу http://localhost:3000/users. Вы можете протестировать его с помощью Postman или curl:

# Получить всех пользователей
curl http://localhost:3000/users

# Получить пользователя по ID
curl http://localhost:3000/users/1

# Создать нового пользователя
curl -X POST http://localhost:3000/users \
  -H "Content-Type: application/json" \
  -d '{"name":"Алексей Сидоров","email":"alex@example.com"}'

Экосистема и дополнительные возможности

Nest.js имеет богатую экосистему пакетов, которые расширяют его функциональность. Некоторые из них:

  • @nestjs/typeorm: Интеграция с TypeORM для работы с базами данных.
  • @nestjs/mongoose: Интеграция с Mongoose для работы с MongoDB.
  • @nestjs/config: Управление конфигурациями приложения.
  • @nestjs/jwt: Работа с JWT токенами для аутентификации.
  • @nestjs/passport: Интеграция с Passport для аутентификации.
  • @nestjs/swagger: Автоматическая генерация документации API.
  • @nestjs/schedule: Планирование задач по расписанию.

Фреймворк также поддерживает создание валидационных пайплайнов для проверки входных данных, интерцепторов для логирования запросов, гuards для защиты маршрутов и многие другие возможности.

Когда стоит выбрать Nest.js

Nest.js — отличный выбор для следующих ситуаций:

  • Создание масштабируемых backend-приложений с четкой архитектурой
  • Командная разработка с множеством разработчиков
  • Проекты, требующие TypeScript и строгой типизации
  • Микросервисная архитектура
  • REST API, GraphQL API или WebSockets
  • Приложения, которые нужно легко тестировать и поддерживать

Если вы создаете простой API с небольшим количеством маршрутов, Express.js может быть более подходящим выбором. Но для серьезных проектов с большим количеством бизнес-логики Nest.js показывает свои преимущества.

Заключение

Nest.js — мощный и современный фреймворк для backend-разработки на Node.js, который сочетает в себе производительность Node.js и структурированную архитектуру, подобную Angular. Его модульная система, внедрение зависимостей и поддержка TypeScript делают код более чистым, тестируемым и поддерживаемым.

Если вы только начинаете свой путь в backend-разработке, Nest.js может показаться сложным из-за множества концепций. Но потратив время на изучение, вы получите инструмент, который поможет создавать профессиональные и масштабируемые приложения.

В следующей статье мы сравним PostgreSQL или MySQL: какую СУБД выбрать для хранения данных в вашем приложении?

💬 Расскажите в комментариях, какой backend-фреймворк используете вы и почему.

Предыдущая статья
ReactReact: базовые концепции и практическое применение
Нет комментариев
Ваш комментарий
Ваш адрес email не будет опубликован.
Обязательные поля помечены *
0
04 апр. 2026