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
相关产品推荐
相关产品推荐

