Основные концепции NestJS: Модули, Провайдеры и Контроллеры

от автора

в
Время чтения: 2 мин.

NestJS — это прогрессивный фреймворк для создания эффективных и масштабируемых серверных приложений на Node.js. Он использует модульную архитектуру, вдохновленную Angular, что делает код организованным и легко поддерживаемым.

В этой статье мы разберем три ключевые концепции NestJS:

  1. Модули (Modules) — организация структуры приложения.
  2. Провайдеры (Providers) — бизнес-логика и внедрение зависимостей.
  3. Контроллеры (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) {} // Внедрение сервиса
}

Типы провайдеров

  1. Стандартные (Class-based) — как в примере выше.
  2. Значения (Value providers) — для констант или готовых объектов.
   const mockCats = [{ name: 'Whiskers' }];

   @Module({
     providers: [
       { provide: 'CATS_DATA', useValue: mockCats },
     ],
   })
  1. Фабрики (Factory providers) — для динамического создания объектов.
  2. Асинхронные (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()GETGET /cats
@Post()POSTPOST /cats
@Put()PUTPUT /cats/1
@Delete()DELETEDELETE /cats/1
@Patch()PATCHPATCH /cats/1
@Param()ПараметрGET /cats/:id
@Body()ТелоPOST /cats {data}
@Query()Query-параметрыGET /cats?limit=10

Как всё это работает вместе?

  1. Запрос приходит на /cats → NestJS направляет его в CatsController.
  2. Контроллер вызывает метод CatsService для обработки данных.
  3. Сервис выполняет бизнес-логику (работа с БД, вычисления).
  4. Ответ возвращается клиенту через контроллер.

Схема взаимодействия

Запрос → Контроллер → Сервис → (База данных) → Сервис → Контроллер → Ответ

Заключение

  • Модули организуют приложение в логические блоки.
  • Провайдеры (сервисы) содержат бизнес-логику и внедряются через DI.
  • Контроллеры обрабатывают HTTP-запросы и возвращают ответы.

Эти три концепции — основа NestJS, и их понимание критически важно для разработки сложных приложений.

Что дальше?

  • Работа с базами данных (TypeORM, Prisma).
  • Аутентификация (JWT, Passport).
  • Микросервисы (gRPC, RabbitMQ).

Попробуйте создать простое приложение, используя эти принципы! 🚀

Документация NestJS: https://nestjs.com


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 7 + 8?