Skip to main content
Практика завдань

Що таке модулі в NestJS і як вони працюють?

NestJS Модулі

Модуль є основним будівельним блоком програми NestJS. Кожен додаток NestJS має принаймні один модуль — кореневий модуль (AppModule). Модулі допомагають організувати вашу програму в цілісні блоки функціональності.


Декоратор @Module()

typescript
import { Module } from '@nestjs/common'; @Module({ imports: [], // інші модулі для імпорту controllers: [], // контролери, визначені в цьому модулі providers: [], // сервіси/постачальники, визначені в цьому модулі exports: [], // постачальники, які потрібно експортувати в інші модулі }) export class UsersModule {}
ВластивістьОпис
importsМодулі, експортовані постачальники яких потрібні тут
controllersКонтролери, що належать до цього модуля
providersСервіси, репозиторії, фабрики тощо
exportsПідмножина постачальників, доступних для імпортуючих модулів

Приклад функціонального модуля

typescript
// users/users.module.ts import { Module } from '@nestjs/common'; import { UsersController } from './users.controller'; import { UsersService } from './users.service'; @Module({ controllers: [UsersController], providers: [UsersService], exports: [UsersService], // зробити UsersService доступним для інших модулів }) export class UsersModule {} // app.module.ts (кореневий модуль) import { Module } from '@nestjs/common'; import { UsersModule } from './users/users.module'; import { PostsModule } from './posts/posts.module'; @Module({ imports: [UsersModule, PostsModule], }) export class AppModule {}

Типи модулів

Функціональний модуль

Групує пов'язані контролери та сервіси для однієї доменної області:

typescript
@Module({ imports: [TypeOrmModule.forFeature([User])], controllers: [UsersController], providers: [UsersService], exports: [UsersService], }) export class UsersModule {}

Спільний модуль

Надає загальні сервіси по всьому додатку, експортувавши їх:

typescript
@Module({ providers: [EmailService, LoggerService], exports: [EmailService, LoggerService], }) export class SharedModule {}

Глобальний модуль

Доступний в кожному модулі без імпорту:

typescript
import { Global, Module } from '@nestjs/common'; @Global() @Module({ providers: [ConfigService], exports: [ConfigService], }) export class ConfigModule {}

Динамічний модуль

Конфігується під час імпорту (корисно для бібліотек):

typescript
@Module({}) export class DatabaseModule { static forRoot(options: DatabaseOptions): DynamicModule { return { module: DatabaseModule, providers: [ { provide: 'DATABASE_OPTIONS', useValue: options }, DatabaseService, ], exports: [DatabaseService], global: true, }; } } // Використання: @Module({ imports: [DatabaseModule.forRoot({ host: 'localhost' })], }) export class AppModule {}

Рекомендована структура папок

src/ ├── app.module.ts ├── main.ts ├── users/ │ ├── users.module.ts │ ├── users.controller.ts │ ├── users.service.ts │ ├── users.repository.ts │ ├── dto/ │ │ ├── create-user.dto.ts │ │ └── update-user.dto.ts │ └── entities/ │ └── user.entity.ts └── shared/ ├── shared.module.ts └── services/ └── email.service.ts

Резюме

Модулі в NestJS є просторами імен, які інкапсулюють область функціональності. Використовуйте функціональні модулі для організації коду, спільні модулі для повторно використовуваних сервісів, глобальні модулі для постачальників на рівні додатка та динамічні модулі для конфігурованих бібліотек. Кожен постачальник повинен належати до модуля, перш ніж його можна буде використовувати.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань