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

NestJS中Commander的MaxListenersExceededWarning:如何提升监听上限?

问题

在app.module.ts中添加超过6个模块(实际需添加21个)时,触发以下警告:

MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added to [Commander]. Use emitter.setMaxListeners() to increase limit

我尝试通过Nest的EventEmitterModule配置调整监听上限:

EventEmitterModule.forRoot({
  maxListeners: 100,
  verboseMemoryLeak: true,
}),

但警告仍然存在,且报错栈显示警告来自Bull库:

(node:15455) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [Commander]. Use emitter.setMaxListeners() to increase limit
    at genericNodeError (node:internal/errors:984:15)
    at wrappedFn (node:internal/errors:538:14)
    at _addListener (node:events:593:17)
    at EventEmitter.addListener (node:events:611:10)
    at /Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/bull/lib/utils.js:39:14
    at new Promise (<anonymous>)
    at Object.isRedisReady (/Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/bull/lib/utils.js:17:10)
    at Queue.setWorkerName (/Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/bull/lib/worker.js:14:8)
    at Queue.setHandler (/Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/bull/lib/queue.js:679:8)
    at Queue.process (/Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/bull/lib/queue.js:657:8)
    at BullExplorer.handleProcessor (/Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/@nestjs/bull/dist/bull.explorer.js:91:23)
    at /Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/@nestjs/bull/dist/bull.explorer.js:53:26
    at MetadataScanner.scanFromPrototype (/Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/@nestjs/core/metadata-scanner.js:34:31)
    at /Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/@nestjs/bull/dist/bull.explorer.js:50:34
    at Array.forEach (<anonymous>)
    at BullExplorer.explore (/Users/maksimov/Documents/CEO/dashboard/dashboard-backend/node_modules/@nestjs/bull/dist/bull.explorer.js:41:19)

如何提升Commander的监听上限?应该在哪里添加emitter.setMaxListeners()代码?


解决方案

警告中的Commander是Bull库内部维护的EventEmitter实例,和Nest自带的EventEmitter不是同一个对象,所以配置EventEmitterModule不会生效。可以通过以下两种方式解决:

方法1:全局调整所有EventEmitter默认上限

在项目入口文件(如main.ts)最顶部添加代码,直接修改Node.js EventEmitter的默认最大监听数:

import { EventEmitter } from 'events';
// 根据模块数量设置足够大的值,比如100
EventEmitter.defaultMaxListeners = 100;

方法2:针对Bull的Commander实例单独调整

如果不想全局修改,可以在Nest中针对每个Bull Queue实例单独配置:

  1. 创建一个配置类,在模块初始化时获取Queue内部的Commander实例并调整上限:
import { Injectable, OnModuleInit } from '@nestjs/common';
import { Queue } from 'bull';
import { InjectQueue } from '@nestjs/bull';

@Injectable()
export class QueueListenerAdjuster implements OnModuleInit {
  // 替换为你的队列名称,如果有多个队列,可重复注入或批量处理
  constructor(@InjectQueue('your-queue-name') private readonly queue: Queue) {}

  onModuleInit() {
    // 获取Bull内部的Commander实例
    const commander = this.queue['_commander'];
    if (commander) {
      commander.setMaxListeners(100);
    }
  }
}
  1. 在对应模块的providers数组中注册这个类,确保在Queue初始化后执行配置。

如果有多个队列,可以封装通用方法遍历所有Queue实例批量设置,避免重复代码。


内容的提问来源于stack exchange,提问作者Артем Максимов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:27:32