Bonjour :-)
J'ai un problème avec les room sur socket.IO

J'ai une appli angular ou je gère des projets et dans ces projets il y a des articles.
Le soucis c'est que je vais pas envoyé tous les articles à tout le monde donc j'aimerais cibler l'emission de ceux-ci.
J'utilise socket.iO et j'ai l'impression qu'il faut que j'utilise le système de room.

Je me suis referé à la doc officiel pour écrire ce bout de code:

socket.on('article', function(id){
        socket.join("article" + id);
        socket.id = id;
        io.sockets.to('article1').emit('apiError');
        console.log("article" +id);
    });
 
 
    socket.on("returnToProject", function(){
        socket.leave("article" + socket.id);
        socket.id =null;
        updateProject;
    });

Mais il ne fonctionne pas je reçoit sur toutes mes fenêtre le message alors que je selectionne des projets differents...

Je ne comprend vraiment pas ...

Si quelqu'un pouvais m'aider...
Je suis bloqué sur mon projet à cause de ça...

4 réponses


Bloudman
Auteur

    socket.on('article', function(id){
        socket.join("article" + id);
        socket.id = id;
        io.sockets.in('article' + id).emit('nouveauArtcile', id);
        console.log("article" +id);
    });

    socket.on("returnToProject", function(){
        socket.leave("article" + socket.id);
        socket.id =null;
        updateProject();
    });

j'ai modifié le code pour receptionné l'id du coté client pour mieux m'y retrouver.

et je me suis rapproché du problème...
En fait le problème n'arrive que pour l'article id=1
Pas les autres ...pourquoi ?

Bloudman
Auteur

J'ai trouvé une solution mais sans utiliser les room... Bon comme c'était le bordel de toutes façons...

voici ma solution si ça peu intérresser:


    socket.on('article', function(id){
            socket.id = id;
            for (var i in io.sockets.connected) {
                var s = io.sockets.connected[i];
                    if (socket.id == s.id) {
                        s.emit("nouveauArticle", s.id);
                    }
            }

    });

    socket.on("returnToProject", function(){
        socket.id = -1;
        console.log(socket.id);
    });

Bonsoir,

Je ne suis pas un expert avec Socket.IO mais dans ton 1er poste, tu modifie l'id de socket par ton id article, hors cet id socket ne doit pas être modifié !

Les "room" sont effectivement très intéressantes pour ce genre de problème et je te conseille de les utiliser.

Tu pourrais faire quelque chose dans ce style :

socket.on('article', function(id){
        socket.join("article" + id);
        // Stock l'id de l'article dans la socket sous l'attribut "idArticle" et non pas "id" qui est déjà utilisé par Socket.IO
        socket.idArticle = id;
        // Permet d'envoyer à tous le monde même la socket actuel
        // "to" et équivalent à "in"
        io.to('article' + id).emit('nouveauArtcile', id);
        // ou 
        // Permet d'envoyer à tous le monde sauf la socket actuel (donc l'utilisateur fait l'action) 
        // C'est selon ton besoin
        socket.broadcast.to('article'+id).emit('nouveauArtcile', id);
        console.log("article" +id);
    });

    socket.on("returnToProject", function(){
        socket.leave("article" + socket.idArticle);
        socket.idArticle =null;
        updateProject;
    });

En espérant t'avoir aidé et éclairé sur le problème !

Bloudman
Auteur

Merci beaucoup j'ai compris mon erreur !!!

Vraiment merci enormement ça m'a beaucoup aidé!