如何在NestJS实现OnApplicationShutdown接口的类中使用Service
问题原因
- 依赖注入失效是因为你的
AppShutdownHook或外部库的FooService没有正确注册到NestJS的IOC容器中,容器找不到对应实例就会注入undefined - 手动
new FooService会创建脱离IOC管理的独立实例,和其他模块注入的单例不是同一个对象,自然全局字段值不一致
解决步骤
方法1:正确注册依赖(推荐)
在你的根模块AppModule中注册两个Provider:
import { Module } from '@nestjs/common'; import { FooService } from '你的外部库包名'; import { AppShutdownHook } from './shutdown.hook'; @Module({ providers: [ FooService, // 将外部库的Service注册为IOC容器中的单例 AppShutdownHook ] }) export class AppModule {}
如果外部库本身已经提供了封装好的模块,直接导入对应模块即可,不需要重复注册FooService:
@Module({ imports: [FooModule], // 导入外部库提供的模块 providers: [AppShutdownHook] }) export class AppModule {}
方法2:手动从IOC容器获取单例
如果不想调整模块注册逻辑,可以直接在main.ts中主动获取容器内的单例实例赋值:
// main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { FooService } from '你的外部库包名'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableShutdownHooks(); // 从IOC容器中取出全局单例的FooService const fooService = app.get(FooService); // 赋值给ShutdownHook实例 const shutdownHook = app.get(AppShutdownHook); shutdownHook.fooService = fooService; await app.listen(3000); } bootstrap();
以上两种方法拿到的都是IOC容器中全局唯一的FooService实例,和其他模块中注入的实例完全一致,内部全局字段也会同步。
内容的提问来源于stack exchange,提问作者rand0rn
相关产品推荐
相关产品推荐

