Socket.io 聊天应用程序显示检测到 EventEmitter 内存泄漏。增加了 11 位听众。使用发射器.setMaxListeners()

Posted

技术标签:

【中文标题】Socket.io 聊天应用程序显示检测到 EventEmitter 内存泄漏。增加了 11 位听众。使用发射器.setMaxListeners()【英文标题】:Socket.io Chat application Shows EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() 【发布时间】:2016-05-05 21:25:15 【问题描述】:

我正在使用socket.ionode.js 加上mysql 作为私人聊天应用程序,当我使用socket.on('example', function(data)...); 时,它会在这里抛出这样的错误代码。

 node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at PoolConnection.EventEmitter.addListener (events.js:175:15)
    at io.on.eventConnection (/Applications/MAMP/htdocs/mysite/node/server.js:72:15)
    at Ping.onOperationComplete [as _callback] (/Applications/MAMP/htdocs/mysite/node/node_modules/mysql/lib/Pool.js:99:5)
    at Ping.Sequence.end (/Applications/MAMP/htdocs/mysite/node/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)
    at Ping.Sequence.OkPacket (/Applications/MAMP/htdocs/mysite/node/node_modules/mysql/lib/protocol/sequences/Sequence.js:105:8)
    at Protocol._parsePacket (/Applications/MAMP/htdocs/mysite/node/node_modules/mysql/lib/protocol/Protocol.js:280:23)
    at Parser.write (/Applications/MAMP/htdocs/mysite/node/node_modules/mysql/lib/protocol/Parser.js:73:12)
    at Protocol.write (/Applications/MAMP/htdocs/mysite/node/node_modules/mysql/lib/protocol/Protocol.js:39:16)
    at Socket.Connection.connect (/Applications/MAMP/htdocs/mysite/node/node_modules/mysql/lib/Connection.js:96:28)
    at Socket.EventEmitter.emit (events.js:96:17)

我的代码在 服务器端:-

function fetchMessages(data)
        var sql = "SELECT `msg_descr`,`msg_to` FROM `message` WHERE (msg_to="+data[0].iChatUserId+" AND msg_from="+data[1]+") OR (msg_to="+data[1]+" AND msg_from="+data[0].iChatUserId+") ORDER BY msg_created_date DESC LIMIT 20";
        eventConnection(sql, function(callback, rows)
            if(callback)
                users[data[1]].emit('Release Msg', messages:rows, selfId:data[0].iChatUserId);
            
        );
    

    //when a user is actibe
    socket.on('load Message', function(data, callback)
        var repsondMsg = fetchMessages(data);
    );

在客户端:-

 chatList.click(function()
        var __this  =   $(this);
            targetData  =   [];
            __userData  =   fetchUserData(__this);
            myId    =   myImage.data('myid');
            targetData.push(__userData, myId);
            socket.emit('load Message', targetData);
            checkExistance(targetData);
    );

    socket.on('Release Msg', function(data)
            $.each(data.messages, function()
                $.each(this, function(k,v)
                    $('*[data-ichatid="'+data.selfId+'"]').children('.body_cht_box_ind').children('#chats').append($('<li>').text(v));
                )
            );
        );

【问题讨论】:

【参考方案1】:

以下链接有解释。 https://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

默认情况下,如果为特定事件添加了超过 10 个侦听器,EventEmitters 将打印警告。这是一个有用的默认值,有助于发现内存泄漏。显然,并非所有事件都应仅限于 10 个侦听器。 emitter.setMaxListeners() 方法允许为这个特定的 EventEmitter 实例修改限制。该值可以设置为 Infinity(或 0)以指示无限数量的侦听器。"

你可以使用这样的东西。

require('events').EventEmitter.defaultMaxListeners = Infinity;

【讨论】:

总结链接的内容通常比粘贴链接要好。如果链接发生变化,您的回答将变得毫无用处。

以上是关于Socket.io 聊天应用程序显示检测到 EventEmitter 内存泄漏。增加了 11 位听众。使用发射器.setMaxListeners()的主要内容,如果未能解决你的问题,请参考以下文章

实战web聊天室(express+socket.io):进退聊天重名检测

聊天应用 - Socket.io - 我如何向其他用户显示消息?

如何检测未注册的socket.io事件?

node.js + socket.io 聊天群聊系统

使用 MERN 堆栈和 socket.io 进行私人聊天

一次与两个用户随机聊天(Socket.io)