Javascript 如何在Socket.io版本4.x中获取有关套接字的信息

Javascript 如何在Socket.io版本4.x中获取有关套接字的信息,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,当我在nodeJs上升级到socket.io的4.x版本时,我遇到了一些问题,有些问题已经解决了。 这里有两个问题,我面临的一个是得到一个插座是所有房间的一部分清单。当我打电话时 socket.rooms连接客户端后,我会得到一个正确的响应,列出一组中的所有房间 根据我使用io.sockets.sockets[536xdn11uf311xkfaad].rooms阅读的内容,我得到了以下错误 TypeError:无法读取未定义的属性“rooms” 在4.x中,如何获得给定插座的房间 另外,我如何获

当我在nodeJs上升级到socket.io的4.x版本时,我遇到了一些问题,有些问题已经解决了。 这里有两个问题,我面临的一个是得到一个插座是所有房间的一部分清单。当我打电话时
socket.rooms
连接客户端后,我会得到一个正确的响应,列出一组中的所有房间

根据我使用
io.sockets.sockets[536xdn11uf311xkfaad].rooms阅读的内容
,我得到了以下错误

TypeError:无法读取未定义的属性“rooms”

在4.x中,如何获得给定插座的房间

另外,我如何获取给定套接字的套接字信息,而无需调用
io.sockets.sockets
然后对其执行“for each”操作以查找我要查找的套接字

在4.x中,如何获得给定插座的房间

socket.rooms
是一个
Set
对象,列出给定套接字所在的房间。这是为socket.io v4记录的

如果使用socket.id而不是socket对象,则可以执行以下操作:

const sockets = await io.in(theSocketId).fetchSockets();
这将是一个套接字数组,但如果传入套接字id,则数组中将有零个或一个项,具体取决于该socketid是否存在。这是文档中的,是一种相当新的做事方式

所以,把这些放在一起:

async function getRooms(socketid) {
    const sockets = await io.in(socketid).fetchSockets();
    if (!sockets.length) {
         throw new Error(`socketid ${socketid} is not found`);
    }
    return Array.from(sockets[0].rooms);
}

注意:使用此接口时,您将需要处理承诺(可能是因为通过redis或其他群集适配器支持远程适配器)。

从文档中,对于给定的套接字,您使用
socket.rooms
(这是一组)。仅供参考,我认为,
io.sockets.sockets
从来都不是公开文档化的接口。很多人都使用过它,但它不在文档中,因此也不是界面的一部分。socket.io是一个很棒的产品,但文档很烂,而且在新版本中会有很多变化。我也不是文档的特别粉丝,但它最近有所改进,可能是您在
io.sockets.sockets
方面遇到问题的原因是它从来都不是一个公共API,因此可能会发生更改。有关使用公共界面的详细信息,请参见下面的答案。谢谢,但这仍然无法回答我如何获得socketid是所有房间的一部分of@SamS87-您的问题是针对给定的套接字,而不是针对给定的socketid,这就是为什么我没有意识到这正是您想要的。无论如何,我已经更新了答案,向您展示了从socketid开始时如何获取套接字。谢谢,这让我更接近我要寻找的内容,因为我现在有了socketid HgeLKVTh76j0PvLyAAAD房间的地图集(3){'HgeLKVTh76j0PvLyAAAD','test','demo'。我唯一仍在挣扎的是将集合更改为我尝试过的数组[…sockets[0].rooms],但这始终会使我得到一个空数组。@SamS87-
array.from(set)
将集合转换为数组。请参阅for
Array.from()
,尽管您可以使用
for(let room of set){…}
迭代集合,就像您可以迭代数组一样,因为两者都支持ES6的通用iterable接口。