Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Node.JS] Socket.IO et fichier séparé

Multiples connexions par un même utilisateur

Sujet résolu
    25 mai 2020 à 9:34:45

    Bonjour,

    Je souhaite séparer mon code des sockets (socket.js) de mon fichier serveur (app.js). Le problème, c'est que lorsqu'un utilisateur recharge la page, un nouveau listener se créé, ce qui provoque cette erreur:

    MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 connection listeners added to [Namespace]. Use emitter.setMaxListeners() to increase limit

    Et si j'émet un appel depuis le côté client, l’événement est émit plusieurs fois. Par contre, si je mets mes appels directement dans app.js, je n'ai plus de problème.

    app.js:

    ...
    io = require('socket.io')(server)
    app.use(require('./socket'))
    app.set('socketio', io);
    ...

    socket.js:

    module.exports= (req,res, next) => {
    
        var io = req.app.get('socketio');
        io.sockets.on('connection', socket => {
            socket.on('ok', () => {
                console.log('hi')})
        })
    
        next()
    }

    Donc concrètement, si je charge une première fois la page et que j'émet l'évènement 'ok' (via un boutton), j'ai du côté serveur dans la console:

    hi
    .



    Si je charge une deuxième fois:

    hi
    hi

    Etc.

    Je ne veux pas utiliser la fonction "setMaxListenersmais éviter d'avoir une mémoire qui se remplie

    Avez-vous déjà eu ce problème et comment l'avez-vous résolu.

    Merci d'avance :)



    -
    Edité par tonin2310 25 mai 2020 à 9:36:24

    • Partager sur Facebook
    • Partager sur Twitter
      26 mai 2020 à 10:12:58

      Après pas mal de recherches et de test, j'ai réussi à résoudre mon problème.

      app.js:

      ...
      io = require('./controllers/sockets').listen(server);
      ...


      ./controllers.sockets:

      let socketio = require('socket.io');
      
      module.exports.listen = (server) => {
          io = socketio.listen(server);
      
          io.on('connection', function(socket){
              socket.on('ok', () => {
                  console.log('hi');
              });
          });
      
          return io;
      }



      • Partager sur Facebook
      • Partager sur Twitter

      [Node.JS] Socket.IO et fichier séparé

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown