Socket.IO 4.0.1:通过id获取socket

11

我使用了

const my_socket = io.sockets.connected['YnwlYH-gCKT2K9jEAAAu'];

很多。

https://dev59.com/o2Af5IYBdhLWcg3wnDsI#24464450

在3.X和4.0.1中是否已经失效?

$ npm list socket.io
socket.io@4.0.1

$ npm list socket.io-client
socket.io-client@4.0.1

# Object.keys(io.sockets):
_events,_eventsCount,_maxListeners,sockets,_fns,_ids,server,name,adapter

# io.sockets.connected:
undefined

# io.sockets.connected['YnwlYH-gCKT2K9jEAAAu']:
TypeError: Cannot read property 'YnwlYH-gCKT2K9jEAAAu' of undefined
    at Socket.<anonymous> (/path:row:char)
    at processTicksAndRejections (internal/process/task_queues.js:86:5)

我可以使用版本2(而不是3或4)来运行它:

$ npm install --quiet --save-dev socket.io@2.X socket.io-client@2.X

没错,这实际上是一个 X - 用于最新的子版本。

你有任何重构指示吗?

2个回答

29

这个问题和答案很可能是https://dev59.com/hl8d5IYBdhLWcg3wNAKy#66835961的一个(新/更好)的重复。对不起,我现在才看到它。感谢Sanjay Nishad。


const my_socket = io.sockets.sockets.get('YnwlYH-gCKT2K9jEAAAu');

1
为了解释上述内容,需要提供一些背景信息:这里有详细的文档:https://socket.io/docs/v4/server-api/#namespacesockets 其中提到namespace.socketsMap<SocketId, Socket>类型。 因此,可以这样解释: io.sockets是默认命名空间, defaultNamespace.sockets是一个Map, 其中Map有一个名为get()的方法,该方法返回一个Socket类型的对象。 - Ben Zenker
1
这个适配器是如何工作的?io.sockets.sockets是否包含来自适配器(例如Redis)的所有套接字? - boozi
1
这个解决方案对于Redis适配器不起作用。当我们在单个节点上运行时,它运行得很好。但是当涉及到使用Redis适配器的多个节点时,它就不起作用了。有没有适用于Redis适配器的任何解决方案? - undefined
@Prakash 你找到解决方案了吗?根据文档,类似这样的代码是否可行:const socket = io.of("/").sockets.get('<socket_id>') - undefined

-1

"socket.io": "^4.1.3"

nsp.sockets.get(socketid).join(roomId)
nsp.to(roomId).emit("message",{message : "something"})

对于我来说,它起作用了


请添加更多细节以扩展您的答案,例如工作代码或文档引用。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接