【发布时间】:2018-11-15 11:16:49
【问题描述】:
我知道这可能会标记为重复的解决方案,但堆栈溢出的解决方案对我不起作用。
问题
(node:5716) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message lis
teners added. Use emitter.setMaxListeners() to increase limit.
我的代码库很大,有时我会遇到这个错误,我不知道为什么会这样。我试图增加听众限制,但不幸的是,它不起作用。
const EventEmitter = require('events');
const emitter = new EventEmitter()
emitter.setMaxListeners(50)
更新
浏览一番后,我运行此命令来跟踪警告
node --trace-warnings index.babel.js
原来是我的 socket.io 代码是我将 socket.io 与 Redis 一起使用的问题。这是错误
node:14212) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 message li
steners added. Use emitter.setMaxListeners() to increase limit
at _addListener (events.js:281:19)
at RedisClient.addListener (events.js:298:10)
at Namespace.<anonymous> (D:/newProject/services/socket.js:21:17)
at emitOne (events.js:115:13)
at Namespace.emit (events.js:210:7)
at Namespace.emit (D:\newProject\node_modules\socket.io\lib\namespace.js:213:10)
at D:\newProject\node_modules\socket.io\lib\namespace.js:181:14
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
这是代码(但此代码用于更具体的任务,它不会一直执行)。
const redis = require('redis');
const config = require('../config');
const sub = redis.createClient(config.REDIS.port, config.REDIS.host);
const pub = redis.createClient(config.REDIS.port, config.REDIS.host);
sub.subscribe('spread');
module.exports = io => {
io.on('connection', socket => {
/* To find the User Login */
let passport = socket.handshake.session.passport;
if (typeof passport !== 'undefined') {
socket.on('typing:send', data => {
pub.publish('spread', JSON.stringify(data));
});
sub.on('message', (ch, msg) => {
// This is the Exact line where I am getting this error
io.emit(`${JSON.parse(msg).commonID}:receive`, { ...JSON.parse(msg) });
});
}
});
};
【问题讨论】:
-
这是 99% 的时间,因为我们忘记在控制流的摘要阶段取消挂钩事件侦听器。您必须始终解开添加到全局执行上下文的每个事件侦听器。您正在构建 React 应用程序吗?
-
@TobiahRex 您好,感谢您的评论,但我是新手,只是一步一步开始,您能举一些例子吗?
-
我打算在了解您的用例后给您一个示例。因此,为什么我问您是否正在构建 React 应用程序,因为我看到您在问题中添加了“reactjs”标签。那么,用例是什么?
-
是的,堆栈是 Node.js/React.js/Mysql/Redis ,如果我使用应用程序这么快就会出现错误。
-
这个库是否让用户调用析构函数?
标签: javascript mysql node.js reactjs