Mysql
 sql >> Base de données >  >> RDS >> Mysql

MaxListenersExceededWarning :possible fuite de mémoire EventEmitter détectée. 11 auditeurs de messages ajoutés. Utilisez emitter.setMaxListeners() pour augmenter la limite

La limite par défaut pour Émetteur d'événements est de 10. Vous pouvez l'augmenter avec l'émetteur.setMaxListeners. Ma suggestion est de ne pas le changer à moins que et jusqu'à ce que cela soit explicitement requis, les auditeurs sont augmentés parce que vous ne vous êtes pas désabonné. Passons maintenant à votre code.

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

Maintenant, si nous analysons le code ci-dessus, si vous ouvrez 20 connexions socket à votre serveur, il s'abonnera 20 fois, ici ça va mal. Maintenant, si votre exigence est d'écouter le message publié sur Redis au niveau du serveur, puis de l'émettre sur io, votre code devrait être comme ci-dessous

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