【NestJS】模块

脚手架中,可以执行 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;
    }
}



猜你喜欢

转载自blog.csdn.net/Superman_H/article/details/129121135