是否有可能获取当前插座所在的房间,而不必调用
io.sockets.clients(roomName)
对于每个房间名称,查找在结果中是否存在该插座。
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']
在 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
io.sockets.manager.roomClients[socket.id]
socket.rooms
似乎无法实现预期功能。我找到的一种不用循环即可获取特定客户端房间的方法是使用io.sockets.adapter.sids[socket.id]
,它将房间作为一个对象返回。{ 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true }
确保套接字一次只在一个房间中,我的解决方案是:
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)
socket.id
字符串查找套接字所在的房间?即不使用传递给事件的 socket
,而只是一个包含 socket.id
的字符串? - user1063287版本1.7.3中,socket.rooms
包含socket.id
,因此需要将其移除并获取房间列表:
Object.keys(socket.rooms).filter(item => item!=socket.id);
socket
并查找房间。版本 2.0.3
io.sockets.sockets[yourSocketID].rooms
socket.rooms
当套接字加入房间时,可以在套接字本身中节省空间
// join room
socket.join(room);
// update socket's rooms
if (socket.rooms) {
socket.rooms.push(room);
} else {
socket.rooms = [room];
}
socket.rooms
来自服务器 API 文档:
socket.rooms (对象)
标识此客户端所在房间的字符串哈希表,以房间名称为索引。
socket.rooms
不是会在每次有 socket 加入房间时自动被 socket.io
更新吗? - user1063287
socket.rooms
在版本 1.3.6 中显示为空白... 对你仍然有效吗?(意思是询问对方是否仍然能够正常使用该功能) - Crashalotundefined
,版本:1.6.0。 - Mr. B.{}
,我正在使用2.3.0版本。 - Dylansocket.join()
,它也会返回一个等于 socket id 的频道。也许你没有在连接函数内调用它?或者你的连接函数参数不是socket
? - cytsunny