Impossible de faire fonctionner une Room avec socket.io

Par fabienc, il y a 9 ans


Javascript NodeJS

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, il y a 9 ans

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 !