Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MaxListenersExceededWarning:Possível vazamento de memória EventEmitter detectado. 11 ouvintes de mensagens adicionados. Use emitter.setMaxListeners() para aumentar o limite


O limite padrão para Emissor de eventos é 10. Você pode aumentá-lo com o emissor.setMaxListeners. Minha sugestão é não alterá-lo, a menos e até que seja explicitamente exigido, os ouvintes são aumentados porque você não cancelou a inscrição. Agora para o seu código.


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) => {
    // this callback will be executed for all the socket connections.
    let passport =
      socket.handshake.session.passport; /* To find the User Login  */

    if (typeof passport !== 'undefined') {
      socket.on('typing:send', (data) => {
        pub.publish('spread', JSON.stringify(data));
      });

      // this is where you are subscribing for each and every socket connected to your server
      sub.on('message', (ch, msg) => {
        // this is the Exact line where I am getting this error

        // whereas you are emitting messages on socket manager, not on the socket.
        io.emit(`${JSON.parse(msg).commonID}:receive`, { ...JSON.parse(msg) });
      });
    }
  });
};

Agora, se analisarmos o código acima, se você abrir 20 conexões de soquete para o seu servidor, ele se inscreverá 20 vezes, aqui está dando errado. no io, seu código deve ser como abaixo


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

  io.on('connection', (socket) => {
    let passport =
      socket.handshake.session.passport; /* To find the User Login  */

    if (typeof passport !== 'undefined') {
      socket.on('typing:send', (data) => {
        pub.publish('spread', JSON.stringify(data));
      });
    }
  });
};