是否可以在不调用的情况下获取当前插座所在的房间
io.sockets.clients(roomName)
对于每个房间名称并在结果中查找此套接字
在 socket.io 版本 1+ 中,语法为:
socket.rooms
交叉兼容方式
var rooms = Object.keys(io.sockets.adapter.sids[socket.id]);
// returns [socket.id, 'room-x'] or [socket.id, 'room-1', 'room-2', ..., 'room-x']
更新:Socket.io 3.0 发布
<小时 />有了3.x
Socket.rooms现在Set
,这意味着房间中的值可能只出现一次。
结构示例:Set(4) {"<socket ID>", "room1", "room2", "room3"}
io.on("connect", (socket) => {
console.log(socket.rooms); // Set { <socket.id> }
socket.join("room1");
console.log(socket.rooms); // Set { <socket.id>, "room1" }
});
要检查特定房间:
socket.rooms.has("room1"); // true
有关 Set 和可用方法的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
迁移文档:https://socket.io/docs/migrating-from-2-x-to-3-0/
来自 Socket.IO 室文档:
io.sockets.manager.roomClients[socket.id]
当使用非默认适配器(如 socket.io-redis )时,socket.rooms
似乎无法解决问题。我设法在不循环的情况下为特定客户端获取房间的方法是使用 io.sockets.adapter.sids[socket.id]
,它将房间作为对象返回。
{ 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true }
请注意,这不会列出其他进程的套接字!
socket.io v1.3.7, socket.io-redis 1.0.0
版本 1.7.3,socket.rooms
包含 socket.id
,因此请将其删除并获取房间列表:
Object.keys(socket.rooms).filter(item => item!=socket.id);
在其他版本中,您可以打印socket
并找到房间。
确保插座一次只在一个房间,我的解决方案是:
var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);
Socket.io v2.1.1
因此,请确保您没有像我一样访问disconnect
事件中的套接字房间,因为在触发该事件时它们已经离开了房间。如果您想这样做,请在disconnecting
事件中尝试 - https://github.com/socketio/socket.io/pull/2332/files
然后,您可以使用以下任一方法:
Object.keys(socket.adapter.rooms)
Object.keys(socket.adapter.sids)
Object.keys(socket.rooms)
>版本 2.0.3
io.sockets.sockets[yourSocketID].rooms
等于
socket.rooms
> socket.io 1.7.3 +
var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room
当插槽加入房间时,您可以在插槽本身中节省空间
// join room
socket.join(room);
// update socket's rooms
if (socket.rooms) {
socket.rooms.push(room);
} else {
socket.rooms = [room];
}
稍后,您可以简单地检索插座所在的所有房间
socket.rooms
从服务器 API 文档中:
插座房间(对象)
标识此客户端所在的聊天室的字符串哈希,按聊天室名称编制索引。
https://socket.io/docs/server-api/#socket-rooms
有了socket.rooms
,您将获得一组socketId及其房间。
因此,您可以将其转换为数组,然后将其切片以仅获得这样的房间:
[...socket.rooms].slice(1, );
然后我们可以遍历该数组或访问任何房间,例如:
[...socket.rooms].slice(1, )[1] // to get first room