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实例单独配置:
- 创建一个配置类,在模块初始化时获取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); } } }
- 在对应模块的
providers数组中注册这个类,确保在Queue初始化后执行配置。
如果有多个队列,可以封装通用方法遍历所有Queue实例批量设置,避免重复代码。
内容的提问来源于stack exchange,提问作者Артем Максимов
相关产品推荐
相关产品推荐

