2016-01-28 6 views
5

Używam socket.io i node.js plus mysql do prywatnej aplikacji czatu i kiedy używam socket.on('example', function(data){...}); To wyrzuca taki kod błędu tutaj.Aplikacja czatu Socket.io Wykryto wyciek pamięci EventEmitter. Dodano 11 słuchaczy. Użyj emitter.setMaxListeners()

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) 

A mój kod w stronie serwera: -

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); 
    }); 

Na stronie klienta: -

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)); 
       }) 
      }); 
     }); 

Odpowiedz

0

Poniższy link ma wyjaśnienia. https://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

Domyślnie EventEmitters wypisze ostrzeżenie, jeśli więcej niż 10 słuchaczy są dodawane do określonego zdarzenia. Jest to użyteczne ustawienie domyślne, które pomaga znaleźć wycieki pamięci. Oczywiście nie wszystkie wydarzenia powinny być ograniczone do zaledwie 10 słuchaczy. Metoda emitter.setMaxListeners() pozwala na modyfikację limitu dla tej konkretnej instancji EventEmitter. Wartość ta może być ustawiony do nieskończoności (lub 0) dla wskazać nieograniczoną liczbę słuchaczy.”

można użyć coś takiego.

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

To jest zwykle lepiej podsumować co link mówi niż po prostu wklejanie. Jeśli link się zmieni, twoja odpowiedź stanie się bezużyteczna. – Tavo