Javascript 如何在Socket.io版本4.x中获取有关套接字的信息
当我在nodeJs上升级到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中,如何获得给定插座的房间 另外,我如何获
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)
将集合转换为数组。请参阅forArray.from()
,尽管您可以使用for(let room of set){…}
迭代集合,就像您可以迭代数组一样,因为两者都支持ES6的通用iterable接口。