如何正确访问 socket.io 中插座连接的房间列表?

How to properly access the list of rooms a socket is connected to in socket.io?

所以我试图在用户与套接字服务器断开连接时向特定房间发送通知。我的服务器端有这个:

socket.on('disconnect', function() {
    for (room of socket.rooms) {
        console.log("Found a room: " + room)
        //going to try to emit to the rooms the client is connected to here.
    }
    console.log("DISCONNECTED USER: " + socket.id);
});

这应该会打印出插座当前连接到的房间列表,但是当我让插座加入房间然后断开连接时,打印出来的只是“DISCONNECTED USER: myID”。不太确定该怎么做。

问题是 socket.rooms 在触发断开连接事件处理程序时已经被清空。

我知道解决这个问题的唯一方法是单独记录你把插座放在哪个房间。因为只有你的服务器可以把它放在一个房间里,你可以访问添加到房间或从房间中删除它的代码。然后,当您收到 disconnect 事件时,您将拥有自己的房间列表。

这是一个例子:

io.on('connection', (socket) => {
    socket.myRooms = new Set();

    // whatever message you use to add a socket to a room
    socket.on('addToRoom', (roomName) => {
         socket.join(roomName);

         // update our shadow copy of the rooms list
         socket.myRooms.add(roomName);
    });

    // whatever message you use to remove a socket from a room
    socket.on('removeFromRoom', (roomName) => {
         socket.leave(roomName);

         // update our shadow copy of the rooms list
         socket.myRooms.delete(roomName);
    });

    socket.on('disconnect', () => {
        for (let room of socket.myRooms) {
            console.log("Found a room: " + room)
            io.to(room).emit(...);
        }
        console.log("DISCONNECTED USER: " + socket.id);             
    });
});