nest.js学习 - 全局模块和生命周期

全局模块

nest.js项目一般由各个模块组成,如果一个模块A需要使用到模块B中的provider,那么需要在模块B中导出对应的provider, 同时还需要在模块A中导入模块B,这样才能使用模块B的provider

import { Global, Module } from '@nestjs/common';
import { AaaService } from './aaa.service';
import { AaaController } from './aaa.controller';

@Module({
  controllers: [AaaController],
  providers: [AaaService],
  exports: [AaaService], // 导出的provider
})
export class AaaModule {}
import { Module } from '@nestjs/common';
import { BbbService } from './bbb.service';
import { BbbController } from './bbb.controller';
import { AaaModule } from 'src/aaa/aaa.module';

@Module({
  imports: [AaaModule],
  controllers: [BbbController],
  providers: [BbbService],
})
export class BbbModule {}

但是如果一个模块被多个其他模块所依赖,这样一个一个导入会显得很麻烦, 因此需要使用@Global装饰器将其作为全局模块,这样全局模块对所有其他模块均可见,不再需要导入模块了

import { Global, Module } from '@nestjs/common';
import { AaaService } from './aaa.service';
import { AaaController } from './aaa.controller';

@Global() // 
@Module({
  controllers: [AaaController],
  providers: [AaaService],
  exports: [AaaService], // 导出的provider
})
export class AaaModule {}
import { Module } from '@nestjs/common';
import { BbbService } from './bbb.service';
import { BbbController } from './bbb.controller';

@Module({
  imports: [],
  controllers: [BbbController],
  providers: [BbbService],
})
export class BbbModule {}

启动时的生命周期

nest.js启动时生命周期流程

在启动过程中,onModuleInit和onApplicationBootstrap都是我们可以实现的生命周期方法 nest.js提供了对应的接口OnModuleInit和OnApplicationBootstrap

...

@Controller('ccc')
export class CccController
  implements
    OnModuleInit,
    OnApplicationBootstrap,
{
  constructor(private readonly cccService: CccService) {}

  onModuleInit() {
    console.log('CccController onModuleInit');
  }
  onApplicationBootstrap() {
    console.log('CccController onApplicationBootstrap');
  }

  ...
}

结束时的生命周期

nest.js结束时生命周期流程

在结束过程中,onModuleDestroy和beforeApplicationShutdown以及onApplicationShutdown都是我们可以实现的生命周期方法 nest.js提供了对应的接口OnModuleDestroy和BeforeApplicationShutdown以及OnApplicationShutdown

@Controller('ccc')
export class CccController
  implements
    OnModuleDestroy,
    BeforeApplicationShutdown,
    OnApplicationShutdown
{
  constructor(private readonly cccService: CccService) {}

  onModuleDestroy() {
    console.log('CccController onModuleDestroy');
  }

  beforeApplicationShutdown(signal?: string) {
    console.log('CccController beforeApplicationShutdown');
  }

  onApplicationShutdown(signal?: string) {
    console.log('CccController onApplicationShutdown');
  }

  ...
}