nest系列 - module

59 阅读2分钟

每一个 nest 应用至少有一个模块,即初始化时的 AppModule,但程序复杂的时候往往需要多个模块,多个模块都需要注入到 根模块 中才可以使用, 今天总结一下 模块的使用

基本用法

当我们使用 nest g res list 时会自动创建一个模块,并且自动注入到根模块中

@Module({
  controllers: [ListController],
  providers: [ListService],
  exports: [ListService],
})
export class ListModule{}

// 根模块
@Module({
    imports: [ ListModule ]
})
export class AppModule {}

共享模块

list模块 的 Service 想暴露给其他模块使用; 可以使用 exports 导出该服务

@Module({
  controllers: [ListController],
  providers: [ListService],
  exports: [ListService],
})
export class ListModule{}

在 cat 的模块中使用 imports 导入 ListModule,即可以在 cat 的 service 中使用

@Module({
  imports: [
    ListModule
  ],
  controllers: [CatsController],
  providers: [CatsService]
 })
 export class CatsModule {}

全局模块

目的是 使用其他服务的时候无需引入注册
使用 装饰器 @Global 对 ListModule 进行装饰即可(但仍需导出 service)

@Global()
@Module({
  controllers: [ListController],
  providers: [ListService],
  exports: [ListService],
})
export class ListModule{}

由于已经是全局模块,不需要在CatsModule中 引入,直接可以使用 ListService

动态模块

在链接 mongoose 的时候,在 App.module 中传入参数

import { MongooseModule } from '@nestjs/mongoose';
@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost/nest')
  ],
   controllers: [AppController],
   providers: [AppService]
  })
  export class AppModule {}

MongooseModule使用 forRoot 静态方法传入数据库名称

仿照一个

@Module({
  imports: [
    MongooseModule.forRoot('mongodb://localhost/nest'),
    //****
    ListModule.forRoot({
      path:"abcd"
    }),
    //****
    CatsModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

在 list.module 中添加静态方法 forRoot,代码如下 👇

import { DynamicModule, Global, Module } from "@nestjs/common";

interface Options {
  path: string;
}

@Global()
@Module({
  controllers: [ListController],
  providers: [ListService],
  exports: [ListService],
})
export class ListModule {
  static forRoot(options: Options): DynamicModule {
    return {
      module: ListModule,
      providers: [
        {
          provide: "Config",
          useValue:  { baseApi: "/api" + options.path },
        },
      ],
      exports: [
        {
          provide: "Config",
          useValue: { baseApi: "/api" + options.path },
        },
      ],
    };
  }
}

由于使用了 @Global, 在其他模块中无需引入此 module,即可使用 exports 中的内容

cat.controller

export class CatsController { 
    constructor(@Inject("Config") private readonly a: any){}
    
        @Post("create")
        async create() {
         console.log(this.a,"cdd")
         return 123
       }
}

image.png 说明已经把参数传递了进来