Що таке модулі в NestJS і як вони працюють?
NestJS Модулі
Модуль є основним будівельним блоком програми NestJS. Кожен додаток NestJS має принаймні один модуль — кореневий модуль (AppModule). Модулі допомагають організувати вашу програму в цілісні блоки функціональності.
Декоратор @Module()
import { Module } from '@nestjs/common';
@Module({
imports: [], // інші модулі для імпорту
controllers: [], // контролери, визначені в цьому модулі
providers: [], // сервіси/постачальники, визначені в цьому модулі
exports: [], // постачальники, які потрібно експортувати в інші модулі
})
export class UsersModule {}| Властивість | Опис |
|---|---|
imports | Модулі, експортовані постачальники яких потрібні тут |
controllers | Контролери, що належать до цього модуля |
providers | Сервіси, репозиторії, фабрики тощо |
exports | Підмножина постачальників, доступних для імпортуючих модулів |
Приклад функціонального модуля
// 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 {}Типи модулів
Функціональний модуль
Групує пов'язані контролери та сервіси для однієї доменної області:
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService],
})
export class UsersModule {}Спільний модуль
Надає загальні сервіси по всьому додатку, експортувавши їх:
@Module({
providers: [EmailService, LoggerService],
exports: [EmailService, LoggerService],
})
export class SharedModule {}Глобальний модуль
Доступний в кожному модулі без імпорту:
import { Global, Module } from '@nestjs/common';
@Global()
@Module({
providers: [ConfigService],
exports: [ConfigService],
})
export class ConfigModule {}Динамічний модуль
Конфігується під час імпорту (корисно для бібліотек):
@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 є просторами імен, які інкапсулюють область функціональності. Використовуйте функціональні модулі для організації коду, спільні модулі для повторно використовуваних сервісів, глобальні модулі для постачальників на рівні додатка та динамічні модулі для конфігурованих бібліотек. Кожен постачальник повинен належати до модуля, перш ніж його можна буде використовувати.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.