Bonjour à tous,

Encore une fois, je vous demande de l'aide, car je ne m'en sors pas !
Cela fait 2 semaines que j'essaie de faire fonctionner mes rooms dans mon tchat.
J'ai suivi les 2 tutos sur le tchat avec socket.io et la persistance des messages dans le tchat.
Ca fonctionnait correctement, jusqu'à ce que j'essaie d'ajouter des rooms.

En effet, je veux que des utilisateurs qui appartiennent un même projet, accède au Tchat.
J'ai donc essayé d'ajouter des rooms, ce qui semblait être simple à l'origine.
Mais manque de peau, plus rien ne fonctionne.

ex. un user récupère les derniers messages de la room sans soucis, mais lorsque je fais un post, et bien, même en debug *DEBUG= node server.js** , je ne vois rien passer concernant le message.

J'ai cherché sur Internet tout ce qui pouvait m'aider à comprendre les room.
Je n'utilise pas express, car je n'ai pas réussi à le faire fonctionner avec cakephp

Du coup, voici le code de mon fichier server.js


io.sockets.on("connection", function (socket) {

    socket.on('login', function (user) {
        // on quitte la room qui nous a été attribuée au début
        socket.leave(socket.id);
        // on rejoins la nouvelle room
        room = user.team_token;

        socket.join(room);
        //console.log(io.sockets.adapter.sids[socket.id]);
        if (io.sockets.adapter.sids[socket.id][room]) {
            // dans ce cas on renvoit logged        
            console.log("========> on a rejoint la room <======");
            // on vérifie que l'utilisateur est bien autorisé à rejoindre la room
            bddMain.query(' ' +
                    'bla bla bla......',
                    [user.login_token, user.project_token],
                    function (err, rows, fields) {
                        //console.log("\n========== rows")
                        //console.log(rows);
                        //console.log("\n========== fields")
                        //console.log(fields);
                        if (err) {
                            console.log(err);
                            socket.in(room).emit('error', err.code)
                        } else if (rows.length === 1) { // si on on un enregistrement de trouvé
                            // on lance la connexion à la room

                            socket.broadcast.in(room).emit("logged");

                            // on récupère toutes les informations de notre user
                            bddMain.query('' +
                                    'bla bla bla.....',
                                    [user.project_token, room],
                                    function (err, rows, fields) {
                                        if (err) {
                                            console.log(err);
                                            socket.in(room).emit('error', err.code)
                                        } else {
                                            //console.log("\n========== rows")
                                            //console.log(rows);
                                            me = {
                                                username: rows[0].username,
                                                id: user.project_token,
                                                avatar: "/img/bla bla bla..../" + rows[0].photo,
                                                roomid: room
                                            };

                                            console.log("\n===> " + me.username + " a rejoint la room : " + room + " <===\n");
                                            // on stock les données du user dans la variables des users
                                            users[socket.id] = me;
                                            // on récupère les anciens messages
                                            getLastComments();
                                        }
                                    });

                        } else { // on renvoi une erreur
                            socket.in(room).emit('error', {
                                message: __("Vous n'êtes pas autorisé à accéder à ce Tchat")
                            })
                        }
                    });
        } else {
            // on renvoi une erreur
            console.log("\n\n pas dans la room \n\n")
        }
    });

    // on entre dans la room
    var getLastComments = function () {
        //console.log("\n anciens messages");
        bddMain.query('' +
                'bla bla bla........ ' +
                'LIMIT 10',
                [room],
                function (err, rows) {
                    if (err) {
                        console.log(err);
                        socket.in(room).emit('error', err.code)
                    } else {
                        //console.log("\n========== rows 10 comments from bdd")
                        //console.log(rows);
                        var messages = [];
                        rows.reverse(); // On veut les plus vieux en premier
                        for (k in rows) {
                            var row = rows[k];
                            var message = {
                                message: row.content,
                                created: row.created,
                                user: {
                                    id: row.user_token,
                                    username: row.username,
                                    avatar: "/img/bla bla bla..../" + row.photo
                                }
                            };
                            messages.push(message)
                        }
                        //console.log("\n========== rows 10 comments from bdd formated")
                        //console.log(messages);

                        // on envoi les messages au user et pas à la room entière
                        socket.emit('newmsg', messages);
                    }
                }
        );
    };

    // définition des variables

    socket.on('newmsg', function (message) {
        //console.log("=======> message <========")
         //console.log(message);
         //console.log("=======> me <========")
         //console.log(me);
        if (message.message === '' || me.id === undefined) {
            socket.to(room).emit('error', 'Vous ne pouvez pas envoyer un message vide')
        } else if (me.id === undefined) {
            socket.to(room).emit('error', 'Vous devez être identifié pour envoyer un message')
        } else {
            message.user = me;
            //console.log(message);

            bddTchat.query('INSERT INTO bla bla bla....', [
                message.user.id,
                message.message,
                room,
                message.created
            ], function (err) {
                if (err) {
                    console.log(err);
                    socket.to(room).emit('error', err.code)
                } else {
                    messages[0] = message;
                    //console.log("=======> message <========")
                    console.log(messages);
                    console.log("\n\n"+room+"\n\n")
                    io.sockets.to(room).emit('newmsg', messages)
                }
            })
        }
    });

    // on va vérifier les utilisateurs qui se sont déconnectés pour mettre à jour la liste des données
    socket.on('disconnect', function () {

        socket.leave(room);
        delete users[socket.id];
        console.log("\n===> " + me.username + " a quitté la room : " + room + " <===\n");
    });

});

Je ne comprends pas ce qu'il se passe !
Mes users ne semblent plus être dans la même room à moins qu'ils ne l'aient jamais été !
Du coup je bloque.

Si vous aviez une idée, je suis preneur.

Merci à tous

1 réponse


fabienc
Auteur

Alors j'avance un peu.
J'ai trouvé un début de réponse, qui fait que mes messages sont envoyés correctement maintenant !
J'ai spécifié le type de transport, vu ici

var socket = io.connect("http://localhost:1337",{
        transports:[ 'websocket' ]
    });

Maintenant, faut que je comprenne pourquoi un utilisateur connecté est systématiquement déconnecté lorsqu'un nouveau user se connecte à la room !