刷新/重新加载socket.io“连接”事件不会触发

今天有socket.io的问题。 当我刷新页面.on(“connect”,{})永远不会触发。 当我从url中加载一个页面时,所有的事件都应该如此。 正如你可以看到下面我设置gameStatus破碎。 在一系列客户/服务器通信之后,游戏状态应该更新为“就绪”,并且应该在服务器上创build新的玩家。 当我重新加载页面(cmd + r)时,没有客户端事件触发。

服务器端识别新的连接“看到”新的socket.id并发出“发送空间”事件,但事件在客户端没有收到。

我试图强制新的连接,但我不知道我是否正确使用。

上周这工作正如我所料,然后今天甚至没有更新的代码,它不能让页面刷新触发这些事件。 一切正常,如果我从完整的url( http://localhost:3000在这种情况下)加载页面,

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

在刷牙之后,我发现socket.io的暴露的"connect"方法在刷新页面之前触发window.onload 。 所以我的事件处理程序不是在服务器发出"connect."的时候设置的"connect." 如果客户错过了第一个"connect"一切都会分开。 我通过将事件处理程序移出window.onload来解决了这个问题。

你可能会find其他解决scheme,但这是我的:

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