Привет! В предыдущей статье мы разобрали основы 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 startAPI будет доступен по адресу 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-фреймворк используете вы и почему.


Обязательные поля помечены *