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

如何用NestJS实现Express的server.on('listening')事件监听?

监听NestJS服务成功连接的标准方式

适配器无关的核心实现

NestJS的app.listen()会返回一个适配器无关的HttpServer抽象实例,你可以直接在这个实例上监听标准的listening事件,这是官方支持的标准方式,无需针对Express/Fastify做特殊判断。

基础用法代码示例

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const httpServer = await app.listen(3000);
  
  // 监听服务成功建立连接事件
  httpServer.on('listening', async () => {
    console.log('服务已成功启动并监听连接');
    // 执行你的业务逻辑,比如注册服务到配置中心、发送启动通知等
  });
}
bootstrap();

解耦式实现(跨模块监听)

如果需要在其他模块中解耦处理该事件,可以结合NestJS的事件发射器实现:

  1. 定义自定义事件类
// src/events/server-listened.event.ts
export class ServerListenedEvent {
  constructor(public readonly port: number) {}
}
  1. 在启动代码中触发事件
// main.ts
import { NestFactory } from '@nestjs/core';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { AppModule } from './app.module';
import { ServerListenedEvent } from './events/server-listened.event';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const eventEmitter = app.get(EventEmitter2);
  const httpServer = await app.listen(3000);
  
  httpServer.on('listening', () => {
    const port = httpServer.address().port;
    eventEmitter.emit('server.listened', new ServerListenedEvent(port));
  });
}
bootstrap();
  1. 在任意模块中监听事件
// src/modules/notification/notification.service.ts
import { Injectable } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';
import { ServerListenedEvent } from '../../events/server-listened.event';

@Injectable()
export class NotificationService {
  @OnEvent('server.listened')
  handleServerListened(event: ServerListenedEvent) {
    console.log(`服务已在端口${event.port}启动,开始发送通知...`);
    // 执行你的解耦业务逻辑
  }
}

关键说明

  • HttpServer是NestJS的统一抽象层,所有HTTP适配器都实现了该接口,监听listening事件完全符合框架设计规范,并非hack方式。
  • 该方式支持服务重连等场景下的多次事件触发,比app.listen()后的同步代码更可靠。
  • onApplicationBootstrap()钩子确实是在监听启动前执行,不适合处理连接成功后的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:35:09