如何用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的事件发射器实现:
- 定义自定义事件类
// src/events/server-listened.event.ts export class ServerListenedEvent { constructor(public readonly port: number) {} }
- 在启动代码中触发事件
// 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();
- 在任意模块中监听事件
// 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
相关产品推荐
相关产品推荐

