当前位置: 首页 > 工具软件 > nestjs-bff > 使用案例 >

【NestJS】模块

乐正乐湛
2023-12-01

脚手架中,可以执行 nest g mo XXX 创建模块。通过脚手架命令创建的模块,会自动被导入至根模块注册。

注意:项目中的模块都需要导入到根模块中注册一下才能被使用。



共享模块

nest g res boynest 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;
    }
}



 类似资料: