You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NestJS实现OnApplicationShutdown接口的类中使用Service

问题原因

  1. 依赖注入失效是因为你的AppShutdownHook或外部库的FooService没有正确注册到NestJS的IOC容器中,容器找不到对应实例就会注入undefined
  2. 手动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:30:05