sql >> Base de Datos >  >> RDS >> Mysql

MaxListenersExceededWarning:se detectó una posible pérdida de memoria de EventEmitter. Se agregaron 11 oyentes de mensajes. Use emitter.setMaxListeners() para aumentar el límite

El límite predeterminado para Emisor de eventos es 10. Puede aumentarlo con emitter.setMaxListeners. Mi sugerencia es no cambiarlo a menos y hasta que se requiera explícitamente, los oyentes aumentan porque no se dio de baja. Ahora a tu 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) });
      });
    }
  });
};

Ahora, si analizamos el código anterior, si abre 20 conexiones de socket a su servidor, se suscribirá 20 veces, aquí va mal. Ahora, si su requisito es escuchar el mensaje publicado en Redis a nivel de servidor y luego emitirlo en io, entonces tu código debería ser como el siguiente

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