每一个 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
}
}
说明已经把参数传递了进来