我正在构建一个NodeJS Express应用程序,该应用程序将socket.io
用于服务器端的实时服务。在客户端,我将ReactJS与socket.io-client
模块一起使用。
我正在尝试创建一个房间ID,并向它们添加一个套接字,然后从服务器向加入该房间的客户端/套接字发出一条消息。套接字的join方法的回调函数已成功调用,并且服务器端没有错误。但是,“发出”消息无法到达客户端。
我尝试了不带房间ID的名称空间发射,并且消息已成功发送到客户端。
我尝试的版本:socket.io
:2.2.0和socket.io-client
:2.2.0
服务器端:
...
// Pending namespace
const pendingNSP = io.of('/pending');
// Joining the socket to Room ID
const battleId = battle._id;
const roomId = `room-${battleId.toString()}`;
socket.join(roomId, () => {
if (!battle.isAvailable) {
// pendingNSP.in(roomId).emit('battleStart', roomId);
// socket.in(roomId).emit('battleStart', battle._id);
// io.sockets.in(roomId).emit('battleStart', battle._id);
// socket.to(roomId).emit('battleStart', battle._id);
// socket.broadcast.to(roomId).emit('battleStart', battle._id);
// --- The code above does not work ---
pendingNSP.emit('battleStart', battle._id); // <-- This works
return battle;
}
});
客户端:
componentDidMount() {
...
this.handleSocketEvents().enterPending(artistId);
this.handleSocketEvents().on();
}
handleSocketEvents = () => {
const io = getIO(this.state.socketEndpoint); // socketEndpoint --> '/pending'
return {
enterPending: (artistId) => {
io.emit('enterPending', {
artistId: artistId
});
},
on: () => {
io.on('battleStart', (battleId) => {
this.setState({battleId: battleId});
this.setState({redirectBattle: true});
});
io.on('error', () => {
io.disconnect(true);
this.setState({errorMsg: "Socket error"})
});
}
}
};
正如我提到的,无房间发射原理确实可行,但是,尝试向房间发射不会给客户端带来任何结果
我在以下链接中发现了一个非常相似的问题,但是我无法从评论中受益:Socket.io - Cannot emit to a specific room but can emit to everyone
任何帮助将不胜感激。 预先感谢