Socket.io "connect" événement sur le rafraîchissement / rechargement ne prendra pas le feu

Avoir un problème avec socket.io aujourd'hui. Lorsque je rafraîchis une page .on ("connect", {}) ne se déclenche jamais. Lorsque je charge une page de l'URL, tous les événements disparaissent comme ils le devraient. Comme vous pouvez le voir ci-dessous, j'ai mis le jeuStatus en rupture. Après une série de communications client / serveur, l'état du jeu doit être mis à jour en «prêt» et un nouveau joueur doit être créé sur le serveur. Lorsque je recharge la page (cmd + r), aucun des événements du côté client ne s'allume.

Le côté serveur reconnaît que la nouvelle connexion «voit» le nouveau socket.id et émet l'événement «envoyer une pièce», mais l'événement n'est pas reçu du côté client.

J'ai essayé de forcer une nouvelle connexion, mais je ne sais pas si je l'utilise correctement.

La semaine dernière, cela a fonctionné comme prévu, puis aujourd'hui sans même mettre à jour le code, il ne peut pas provoquer l'extinction de ces événements sur les rafraîchissements de page. Tout fonctionne comme il se doit si je charge la page de l'URL complète ( http://localhost:3000 dans ce cas)

Index.html:

 var io = io.connect('/', {'force new connection': true}); 

Client.js

 var gameStatus = 'broken'; var localPlayer; window.onload = function() { console.log(gameStatus); // "broken" io.on("connect", onSocketConnected); io.on("disconnect", onSocketDisconnect); io.on("new player", onNewPlayer); io.on("send room", function(data){ console.log("send room fired"); // doesn't fire on refresh addPlayer(data); }); } function onSocketConnected() { console.log("Connected to socket server "); // doesn't connect on refresh // assign socket.sessionid as the player name localPlayer.id = io.socket.sessionid; io.emit("new player", {id: localPlayer.id}); console.log(localPlayer.id); // "undefined" on refresh } function onSocketDisconnect() { console.log("Disconnected from socket server"); } function addPlayer(data) { console.log("addPlayer fired"); // doesn't fire on refresh gameStatus = data.roomStatus; } 

Server.js:

 io.sockets.on('connection', function (socket) { socket.on("disconnect", onClientDisconnect); socket.on("new player", onNewPlayer); }); io.sockets.on("connection", onSocketConnection); function onSocketConnection(socket) { console.log("New player has connected: " + socket.id); var lastRoom = rooms.length-1; // simplified for stackoverflow // send the playerType and roomNum to the client io.sockets.in(lastRoom).emit('send room', { roomStatus: "ready" }); } function onNewPlayer(client) { console.log("new player created!"); // only on first page load var newPlayer = new Player(client.id); players.push(newPlayer); // add player to player array } function onClientDisconnect(socket) { util.log("Player has disconnected: " + this.id); var disRooms = io.sockets.manager.roomClients[this.id]; for (var room in disRooms) { if (room.length > 0) { // if not the global room '' room = room.replace(/\//g, '') console.log('user exits: '+room); this.broadcast.to(room).emit('player left'); } } } 

Après un gros grincement de dents, j'ai découvert que la méthode "connect" exposée de socket.io se déclenche avant window.onload lorsqu'une page est actualisée. Donc, mes gestionnaires d'événements n'ont pas été configurés au moment où le serveur émet "connect." Si le client manque ce premier "connect" tout le reste s'est séparé. J'ai réparé le problème en déplaçant les gestionnaires d'événements de window.onload.

Vous pourriez trouver d'autres solutions, mais c'était le mien:

 var gameStatus = 'broken'; setEventHandlers(); console.log(gameStatus); // "broken" window.onload = function() { // other stuff } function setEventHandlers(){ io.on("connect", onSocketConnected); io.on("disconnect", onSocketDisconnect); io.on("new player", onNewPlayer); io.on("send room", function(data){ console.log("send room fired"); // fires as expected addPlayer(data); }); } function onSocketConnected() { console.log("Connected to socket server "); // connects before window loads // assign socket.sessionid as the player name localPlayer.id = io.socket.sessionid; io.emit("new player", {id: localPlayer.id}); } function addPlayer(data) { gameStatus = data.roomStatus; console.log(gameStatus); // "ready" }