脚手架中,可以执行 nest g mo XXX
创建模块。通过脚手架命令创建的模块,会自动被导入至根模块注册。
注意:项目中的模块都需要导入到根模块中注册一下才能被使用。
nest g res boy
、nest g res girl
如果希望在 girl
模块中使用 boy
模块,需要先在 boy
模块将其 service 导出
import { Module } from '@nestjs/common';
import { BoyService } from './boy.service';
import { BoyController } from './boy.controller';
@Module({
controllers: [BoyController],
providers: [BoyService],
exports: [BoyService], // 导出 boy service
})
export class BoyModule {}
然后在 girl
模块注册 boy
模块
import { Module } from '@nestjs/common';
import { GirlService } from './girl.service';
import { GirlController } from './girl.controller';
import { BoyModule } from 'src/boy/boy.module';
@Module({
controllers: [GirlController],
providers: [GirlService],
imports: [BoyModule], // 注册 boy 模块
})
export class GirlModule {}
现在就可以在 girl
controller 中注入 boy
service 并使用啦~
import { Controller, Get } from '@nestjs/common';
import { GirlService } from './girl.service';
import { BoyService } from 'src/boy/boy.service';
@Controller('girl')
export class GirlController {
constructor(
private readonly girlService: GirlService,
private readonly boyService: BoyService, // 注入 boy service
) {}
@Get()
findAll() {
const result = `${this.boyService.findAll()} and ${this.girlService.findAll()}`;
return result;
}
}
可以使用 @Global()
修饰 boy
模块并导出其 service
import { Global, Module } from '@nestjs/common';
import { BoyService } from './boy.service';
import { BoyController } from './boy.controller';
@Global() // 使用 @Global() 修饰 boy 模块
@Module({
controllers: [BoyController],
providers: [BoyService],
exports: [BoyService], // 导出 service
})
export class BoyModule {}
现在就可以在 任意
controller 中注入 boy
service 并使用啦~
如果需要给模块传入参数,则可以使用动态模块
给该模块添加一个静态方法,来接收参数。@Module()
的配置对象的内容都可以移到静态方法的返回值中
import { DynamicModule, Module } from '@nestjs/common';
import { BoyService } from './boy.service';
import { BoyController } from './boy.controller';
@Module({
/* 配置对象的内容都可以移到静态方法的返回值中 */
})
export class BoyModule {
// 编写静态方法, 接收参数
static forRoot(option: string): DynamicModule {
return {
module: BoyModule,
controllers: [BoyController],
providers: [BoyService, { provide: 'boy', useValue: option }],
exports: [BoyService, { provide: 'boy', useValue: option }],
global: true, // 等效于 @Global(); 默认为 false
};
}
}
在根模块 app
module 中注册动态模块并传入参数
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { BoyModule } from './boy/boy.module';
import { GirlModule } from './girl/girl.module';
@Module({
controllers: [AppController],
providers: [AppService],
imports: [BoyModule, GirlModule, BoyModule.forRoot('superman')], // 注册模块并传入参数
})
export class AppModule {}
现在就可以在 任意
controller 中注入动态模块并使用啦~
import { Controller, Get, Inject } from '@nestjs/common';
import { GirlService } from './girl.service';
import { BoyService } from 'src/boy/boy.service';
@Controller('girl')
export class GirlController {
constructor(
private readonly girlService: GirlService,
private readonly boyService: BoyService,
@Inject('boy') private readonly boy: string, // 注入动态模块
) {}
@Get()
findAll() {
const { boyService, girlService, boy } = this;
const result = `${boyService.findAll()} + ${girlService.findAll()} + ${boy}`;
return result;
}
}