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

Javascript socket.io“;“连接”;刷新/重新加载事件不会触发,javascript,node.js,sockets,socket.io,page-refresh,Javascript,Node.js,Sockets,Socket.io,Page Refresh,今天socket.io出现问题。当我刷新页面时,.on(“connect”{})从不触发。当我从url加载一个页面时,所有事件都会触发。正如你在下面看到的,我将游戏状态设置为“断开”。在一系列客户端/服务器通信后,游戏状态应更新为“就绪”,并在服务器上创建新玩家。当我重新加载页面(cmd+r)时,没有任何客户端事件触发 服务器端识别新连接“看到”新socket.id并发出“发送室”事件,但客户端未接收到该事件 我试图强制建立新的连接,但我不知道我是否正确使用了它 上周,这正如我所预期的那样有效,

今天socket.io出现问题。当我刷新页面时,.on(“connect”{})从不触发。当我从url加载一个页面时,所有事件都会触发。正如你在下面看到的,我将游戏状态设置为“断开”。在一系列客户端/服务器通信后,游戏状态应更新为“就绪”,并在服务器上创建新玩家。当我重新加载页面(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”
,其他一切都会崩溃。我通过将事件处理程序移出window.onload解决了这个问题

你可能会找到其他解决方案,但这是我的:

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

当你强制刷新缓存时会发生什么?你能提供一个优雅的方法来强制刷新缓存吗?我尝试添加
delete require.cache['/client.js']到我的server.js文件。我找不到在客户端强制重新加载的解决方案。在控制台中键入
window.location.reload(true)
将重新加载页面,但“connect”事件仍然不会触发,也不会触发任何.on事件。同样,在浏览器中键入url也可以正常工作。我对socket.io还不熟悉,但我相信上周这一切都很好。测试星期五的build yourself at:事实上,该live url在您第一次加载时不起作用,但在刷新时可以正常工作。基本上与我当前的问题相反。您是否正在查看浏览器的F12控制台以查看问题的迹象?是的,我熟悉chrome和safari中的开发工具,并且一直在监视“网络”选项卡。根据网络选项卡,客户端正在从服务器接收正确的数据包。例如,服务器发出
“发送室”
,客户端接收
“发送室”
,但客户端不触发事件处理程序。我无法判断客户端是否接收到公开的
“connect”
事件,但它从未触发该处理程序。同样,这只发生在页面重新加载时(即:cmd+r)。顺便说一句,如果有关系的话,我用的是express。