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

NestJS如何获取服务启动运行时信息并将其赋值给变量?

NestJS 服务启动时获取运行信息并存储的实现方案

方法1:使用应用生命周期钩子

NestJS 提供了多个内置生命周期钩子,适合在模块/应用初始化阶段执行逻辑,不需要额外依赖:

  • 你可以在任意可注入类(Service、Controller 等)中实现 OnApplicationBootstrap 接口,该钩子会在所有模块初始化完成、应用正式启动前触发,你可以在这里执行信息采集、变量赋值逻辑
    示例代码:
    import { Injectable, OnApplicationBootstrap } from '@nestjs/common';
    
    @Injectable()
    export class AppService implements OnApplicationBootstrap {
      // 用来存储启动信息的变量
      private appStartInfo: Record<string, any> = {};
    
      async onApplicationBootstrap() {
        // 这里可以采集你需要的信息:启动时间、运行环境、配置参数等
        this.appStartInfo = {
          startTime: new Date().toISOString(),
          env: process.env.NODE_ENV,
          // 其他你需要获取的信息
        };
        // 如果需要异步采集也可以直接写 await 逻辑
      }
    
      // 其他地方需要用的时候直接调用该方法即可
      getStartInfo() {
        return this.appStartInfo;
      }
    }
    
  • 如果需要更早的执行时机,可以使用 OnModuleInit 钩子,它会在当前模块依赖初始化完成后立即触发,早于应用全局启动完成的时机。

方法2:在入口启动逻辑中直接采集

如果你需要获取服务监听的端口、服务实例等全局信息,可以直接在入口文件的 bootstrap 函数的 listen 回调中处理:
示例代码:

// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AppService } from './app.service';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const listenPort = 3000;
  await app.listen(listenPort);

  // 服务启动完成后执行采集逻辑
  const appService = app.get(AppService);
  const serverUrl = await app.getUrl();
  // 把你需要的信息存到对应的服务变量里
  appService.setServerInfo({
    port: listenPort,
    serverUrl: serverUrl
  });
}
bootstrap();

方法3:使用自定义提供者预加载信息

如果你的启动信息是固定的配置类、或者需要在所有业务逻辑加载前就完成赋值,可以用自定义提供者的 useFactory 在依赖注入阶段就完成初始化:

// app.module.ts
import { Module, Inject } from '@nestjs/common';

export const APP_START_INFO = Symbol('APP_START_INFO');

@Module({
  providers: [
    {
      provide: APP_START_INFO,
      useFactory: () => {
        // 这里直接生成你需要的启动信息
        return {
          startTime: new Date().toISOString(),
          nodeVersion: process.version,
          platform: process.platform
        }
      }
    }
  ],
  // 其他模块要使用的话直接导出即可
  exports: [APP_START_INFO]
})
export class AppModule {}

使用的时候直接注入即可:

@Injectable()
export class SomeService {
  constructor(@Inject(APP_START_INFO) private startInfo: Record<string, any>) {}
}

注意:如果需要采集的是异步加载的信息(比如启动时查数据库获取配置),可以把 useFactory 写成异步函数,Nest 会等待异步逻辑执行完成再初始化对应的模块。

内容的提问来源于stack exchange,提问作者user17327393

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:54:07