NestJS — это прогрессивный фреймворк для создания эффективных и масштабируемых серверных приложений на Node.js. Он использует модульную архитектуру, вдохновленную Angular, что делает код организованным и легко поддерживаемым.
В этой статье мы разберем три ключевые концепции NestJS:
- Модули (Modules) — организация структуры приложения.
- Провайдеры (Providers) — бизнес-логика и внедрение зависимостей.
- Контроллеры (Controllers) — обработка HTTP-запросов.
1. Модули (Modules)
Модули — это основные строительные блоки NestJS. Каждое приложение имеет хотя бы один корневой модуль (AppModule
), но обычно разбивается на несколько функциональных модулей (например, UsersModule
, AuthModule
).
Пример модуля
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController], // Регистрация контроллеров
providers: [CatsService], // Регистрация сервисов
exports: [CatsService], // Экспорт сервиса для других модулей
})
export class CatsModule {}
Основные свойства модуля
controllers
— список контроллеров модуля.providers
— сервисы, репозитории и другие провайдеры.imports
— другие модули, от которых зависит текущий.exports
— провайдеры, доступные другим модулям.
Динамические и глобальные модули
- Глобальные модули (
@Global()
) доступны во всем приложении без импорта. - Динамические модули позволяют настраивать модули при импорте (например,
ConfigModule.forRoot()
).
2. Провайдеры (Providers)
Провайдеры — это классы, которые могут быть внедрены в другие компоненты (Dependency Injection). К ним относятся:
- Сервисы (
Services
) - Репозитории (
Repositories
) - Фабрики (
Factories
) - Хелперы (
Helpers
)
Пример сервиса
import { Injectable } from '@nestjs/common';
@Injectable() // Декоратор для DI
export class CatsService {
private cats = [];
getAllCats() {
return this.cats;
}
createCat(cat) {
this.cats.push(cat);
return cat;
}
}
Как работает внедрение зависимостей (DI)?
NestJS автоматически создает и управляет экземплярами провайдеров. Достаточно указать зависимость в конструкторе:
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {} // Внедрение сервиса
}
Типы провайдеров
- Стандартные (Class-based) — как в примере выше.
- Значения (Value providers) — для констант или готовых объектов.
const mockCats = [{ name: 'Whiskers' }];
@Module({
providers: [
{ provide: 'CATS_DATA', useValue: mockCats },
],
})
- Фабрики (Factory providers) — для динамического создания объектов.
- Асинхронные (Async providers) — для инициализации с
Promise
.
3. Контроллеры (Controllers)
Контроллеры отвечают за обработку HTTP-запросов и возврат ответов клиенту.
Пример контроллера
import { Controller, Get, Post, Body } from '@nestjs/common';
@Controller('cats') // Префикс маршрута: /cats
export class CatsController {
@Get() // GET /cats
findAll() {
return 'All cats';
}
@Post() // POST /cats
create(@Body() cat: { name: string }) {
return `Created cat: ${cat.name}`;
}
@Get(':id') // GET /cats/1
findOne(@Param('id') id: string) {
return `Cat ${id}`;
}
}
Основные декораторы
Декоратор | HTTP-метод | Пример |
---|---|---|
@Get() | GET | GET /cats |
@Post() | POST | POST /cats |
@Put() | PUT | PUT /cats/1 |
@Delete() | DELETE | DELETE /cats/1 |
@Patch() | PATCH | PATCH /cats/1 |
@Param() | Параметр | GET /cats/:id |
@Body() | Тело | POST /cats {data} |
@Query() | Query-параметры | GET /cats?limit=10 |
Как всё это работает вместе?
- Запрос приходит на
/cats
→ NestJS направляет его вCatsController
. - Контроллер вызывает метод
CatsService
для обработки данных. - Сервис выполняет бизнес-логику (работа с БД, вычисления).
- Ответ возвращается клиенту через контроллер.
Схема взаимодействия
Запрос → Контроллер → Сервис → (База данных) → Сервис → Контроллер → Ответ
Заключение
- Модули организуют приложение в логические блоки.
- Провайдеры (сервисы) содержат бизнес-логику и внедряются через DI.
- Контроллеры обрабатывают HTTP-запросы и возвращают ответы.
Эти три концепции — основа NestJS, и их понимание критически важно для разработки сложных приложений.
Что дальше?
- Работа с базами данных (TypeORM, Prisma).
- Аутентификация (JWT, Passport).
- Микросервисы (gRPC, RabbitMQ).
Попробуйте создать простое приложение, используя эти принципы! 🚀
Документация NestJS: https://nestjs.com
Добавить комментарий