2016-01-28 13 views
5

Sto usando socket.io e node.js più mysql per un'applicazione di chat privata e quando uso socket.on('example', function(data){...}); Getta questo codice di errore qui.Applicazione Chat Socket.io Mostra la perdita di memoria EventEmitter rilevata. 11 ascoltatori aggiunti. Usa 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) 

E il mio codice lato server : -

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

Nel lato client: -

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

risposta

0

Il seguente link ha la spiegazione. https://nodejs.org/docs/latest/api/events.html#events_emitter_setmaxlisteners_n

Con EventEmitters predefinite stamperà un avviso se si aggiungono più di 10 ascoltatori per un particolare evento. Questo è un valore predefinito utile che aiuta a trovare perdite di memoria. Ovviamente, non tutti gli eventi dovrebbero essere limitati a soli 10 ascoltatori. Il metodo emitter.setMaxListeners() consente di modificare il limite per questa specifica istanza EventEmitter. Il valore può essere impostato su infinito (o 0) per indicare un numero illimitato di ascoltatori."

si può usare qualcosa di simile.

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

E 'normalmente meglio per riassumere ciò che il link dice che semplicemente incollandolo Se il link cambia, la tua risposta sarà resa inutile. – Tavo