【问题标题】:Socket.Io how to emit to all members in a room from a socket instance including the senderSocket.Io 如何从包括发送者在内的套接字实例向房间中的所有成员发出
【发布时间】:2022-01-02 22:28:22
【问题描述】:
如何从套接字实例向房间的所有成员发射?
我知道如果我可以访问 IO 实例,我可以做io.in('room').emit('event', data);,但在我的情况下,我只能访问发送者的套接字,我将用户的套接字存储在用户对象中,并传递它围绕我的代码,以便我可以从任何地方发出,但结果我无法访问 IO 实例。
如何从发送者的套接字实例向房间的所有成员(包括发送者)发射?
【问题讨论】:
标签:
javascript
node.js
typescript
sockets
socket.io
【解决方案1】:
好吧,最好让自己以某种方式访问io 实例,这样您就可以访问io.in(room).emit(...)。您可以从创建它的位置将其导出,然后将其导入您所在的位置,也可以通过其他方式使其可用。
这里有其他四种方法:
将.io 属性附加到每个套接字
在您创建io 实例的文件中,您可以将其作为属性附加到每个套接字。
// put io on each socket
io.on('connection', socket => {
socket.io = io;
});
然后,在任何套接字上,您都可以获得io 和socket.io。
将io 实例放入您的app 对象中
如果app 可用,那么有些人将io 实例放在app 对象上,并加上app.set("io", io);,这样其他地方的代码就可以用io.get("io"); 得到它。
同时发送给房间和自己
作为一种解决方法,您也可以同时发送给两者:
socket.broadcast(room).emit(...);
socket.emit(...);
使用未记录的socket.server
socket 上还有一个未记录的属性,可让您访问服务器对象。使用风险自负:
socket.server.in("room").emit(...);
这实际上为您提供了io 实例。