NestJS - Module总结

147 阅读2分钟

在NestJS中,Module是用于组织应用程序结构的基本单位。每个Module封装了一组相关的功能,并且可以导入和导出其他Module

模块是用 @Module() 装饰器注释的类。

Module在NestJS中起到非常重要的作用,它们帮助开发者将应用程序划分为多个独立且可复用的部分。

Capture-2023-11-02-110252.png

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。

动态模块📌📌📌📌📌

动态模块允许你在运行时动态地配置和创建模块。它们通常用于需要根据外部配置或异步操作来初始化模块的场景。

  1. 创建动态模块

要创建一个动态模块,可以使用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'],
    };
  }
}
  1. 使用动态模块

在其他模块中,可以通过调用forRoot方法来导入动态模块。

import { Module } from '@nestjs/common';
import { ConfigModule } from './config.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      key: 'value',
    }),
  ],
})
export class AppModule {}