socket.io evento “conectar” en la actualización / recarga no se dispara

Tener un problema con socket.io hoy. Cuando actualizo una página .on (“conectar”, {}) nunca se dispara. Cuando carga una página de la URL, todos los eventos se activan como deberían. Como se puede ver a continuación, configuro gameStatus en “broken”. Después de una serie de comunicaciones cliente / servidor, el estado del juego debería actualizarse a “listo” y debería crearse un nuevo jugador en el servidor. Cuando recargo la página (cmd + r), no se dispara ninguno de los eventos del lado del cliente.

El lado del servidor reconoce que la nueva conexión “ve” el nuevo socket.id y emite el evento “enviar sala”, pero el evento no se recibe en el lado del cliente.

Intenté forzar una nueva conexión, pero no sé si lo estoy usando correctamente o no.

La semana pasada, esto funcionó como esperaba, y hoy, sin siquiera actualizar el código, no se pueden activar esos eventos en las actualizaciones de la página. Todo funciona como debería si carga la página desde la url completa ( http://localhost:3000 en este caso)

index.html:

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

cliente.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'); } } } 

Después de mucho crujir de dientes, descubrí que el método de "connect" expuesto de socket.io se activa antes de window.onload cuando se actualiza una página. Por lo tanto, mis controladores de eventos no se configuraron cuando el servidor emite "connect." Si el cliente pierde esa primera "connect" todo lo demás se deshace. Solucioné el problema moviendo los controladores de eventos de window.onload.

Podrías encontrar otras soluciones, pero esta era la mía:

 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" } 
Intereting Posts