返回

揭秘 Nest 中的全局模块与生命周期

后端

在 NestJS 中,我们可以使用 @Global() 装饰器将模块标记为全局模块。这将允许我们在任何其他模块中导入该模块,而无需显式地导入它。例如,我们可以创建一个名为 SharedModule 的全局模块,其中包含一些我们希望在整个应用程序中使用的服务或组件。

import { Module } from '@nestjs/common';
import { SharedService } from './shared.service';

@Module({
  providers: [SharedService],
  exports: [SharedService],
})
export class SharedModule {}

现在,我们可以通过在其他模块中导入 SharedModule 来使用其提供的服务或组件。

import { Module } from '@nestjs/common';
import { SharedModule } from '../shared/shared.module';

@Module({
  imports: [SharedModule],
})
export class AppModule {}

除了使用 @Global() 装饰器将模块标记为全局模块外,我们还可以使用 @Injectable() 装饰器将类标记为可注入的。这将允许我们在任何地方注入该类。例如,我们可以创建一个名为 UserService 的服务,并使用 @Injectable() 装饰器标记它。

import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {}

现在,我们可以通过在其他类中注入 UserService 来使用它。

import { Injectable } from '@nestjs/common';
import { UserService } from './user.service';

@Injectable()
export class UserController {
  constructor(private readonly userService: UserService) {}
}

NestJS 还提供了生命周期钩子,允许我们自定义模块的初始化和销毁过程。这些钩子包括 OnInit(), OnDestroy(), BeforeApplicationShutdown()AfterApplicationShutdown(). 我们可以通过实现这些钩子来执行自定义的初始化和销毁逻辑。例如,我们可以创建一个名为 MyModule 的模块,并在其中实现 OnInit() 钩子来打印一条消息。

import { Module } from '@nestjs/common';

@Module({})
export class MyModule {
  OnInit() {
    console.log('MyModule has been initialized!');
  }
}

以上就是 NestJS 中全局模块和生命周期的相关知识。希望本文能帮助您更好地理解和使用 NestJS。