在NestJS中,Module是用于组织应用程序结构的基本单位。每个Module封装了一组相关的功能,并且可以导入和导出其他Module。
模块是用 @Module() 装饰器注释的类。
Module在NestJS中起到非常重要的作用,它们帮助开发者将应用程序划分为多个独立且可复用的部分。
Module装饰器 📌
providers将由 Nest 注入器实例化的提供程序,并且至少可以在此模块中共享controllers此模块中定义的必须实例化的控制器集imports导出此模块中所需的提供程序的导入模块列表exports该模块提供的providers子集, 在导入此模块的其他模块中可用。您可以使用提供程序本身,也可以仅使用其令牌(provide值)
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
})
export class AppModule {}
创建Module
要创建一个Module,可以使用NestJS的CLI命令:
nest generate module [name]
例如:
导入和导出Module
一个Module可以导入其他Module,以便使用它们提供的功能。被导入的Module需要在imports数组中声明。
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [UsersModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
全局Module 📌
有些Module需要在整个应用程序中全局可用,可以使用@Global装饰器将其标记为全局Module。
import { Global, Module } from '@nestjs/common';
@Global
@Module({
providers: [CommonService],
exports: [CommonService],
})
export class CommonModule {}
全局Module只需要导入一次,之后在任何其他Module中都可以直接使用其导出的Provider。
动态模块📌📌📌📌📌
动态模块允许你在运行时动态地配置和创建模块。它们通常用于需要根据外部配置或异步操作来初始化模块的场景。
- 创建动态模块
要创建一个动态模块,可以使用forRoot 等静态方法。这些方法返回一个包含模块元数据的对象。
import { Module, DynamicModule } from '@nestjs/common';
@Module({})
export class ConfigModule {
static forRoot(options: ConfigOptions): DynamicModule {
return {
module: ConfigModule,
providers: [
{
provide: 'CONFIG_OPTIONS',
useValue: options,
},
],
exports: ['CONFIG_OPTIONS'],
};
}
}
- 使用动态模块
在其他模块中,可以通过调用forRoot方法来导入动态模块。
import { Module } from '@nestjs/common';
import { ConfigModule } from './config.module';
@Module({
imports: [
ConfigModule.forRoot({
key: 'value',
}),
],
})
export class AppModule {}