【发布时间】:2020-04-26 10:32:15
【问题描述】:
在我的 MERN 应用中,我有以下代码:
服务器:
io.on('connection', (socket) => {
socket.join('main');
socket.on('start session', function(data){
socket.join('sockets');
});
socket.on('try', () => {
io.in('main').emit('test', 'hi');
io.in('sockets').emit('test', 'hello');
console.dir(socket.rooms);
})
});
客户:
componentDidMount() {
socket.on('connect', function(){console.log('connected to socket')});
socket.on('test', function(data){console.log(data)});
socket.on('event', function(data){console.log(data)});
socket.on('error', (error) => {
console.log(error)
});
}
setSession(id, slug) {
if(!this.state.sessionId) {
socket = io(serverUrl);
this.setState({ sessionId: id, slug: slug });
let sessionInfo = {room: id, slug: slug};
console.log(`Session local init. SessionId: ${id}, Slug: ${slug}`);
socket.emit('start session', sessionInfo);
}
}
在一个单独的客户端组件中,当我单击按钮时会发出“尝试”事件。
服务器控制台验证套接字是否在两个房间中(这在我们发出事件后调用,因此套接字的房间不会被更改/覆盖)...
{
ub1_9Nw3sMtfZQtBAAAF: 'ub1_9Nw3sMtfZQtBAAAF',
main: 'main',
sockets: 'sockets'
}
...但是,客户端只接收到“主”房间发出的事件,而不是“套接字”房间。服务器认为客户端在两个房间中,唯一的区别是“套接字”房间分配在事件回调中,而“主”房间分配位于“连接”函数的顶层。想法?
【问题讨论】: