【问题标题】:Socket.io - io.in(room).emit() not working on rooms joined in callbacksSocket.io - io.in(room).emit() 不适用于加入回调的房间
【发布时间】: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'
}

...但是,客户端只接收到“主”房间发出的事件,而不是“套接字”房间。服务器认为客户端在两个房间中,唯一的区别是“套接字”房间分配在事件回调中,而“主”房间分配位于“连接”函数的顶层。想法?

【问题讨论】:

    标签: node.js reactjs socket.io


    【解决方案1】:

    只有在客户端发出 'start session' 事件时,您才加入 'sockets' 房间。

    socket.on('start session', function(data){
        socket.join('sockets');
    });
    

    客户端似乎只在setSession 中发出'start session',我没有看到该方法在任何地方被调用。

    【讨论】:

    • 我应该更清楚一点,那只是客户端代码的摘录。 setSession 在客户端初始化时被调用,我已经在服务器端验证它确实加入了房间 - 请参阅服务器控制台 sn-p
    【解决方案2】:

    目前,我已经设法通过在客户端连接时在查询参数中发送房间名称来绕过这个问题。

    客户:

    socket = io(serverUrl, {query: {id: id}});
    

    服务器:

    io.on('connection', (socket) => {
      socket.join(socket.request._query.id);
      socket.on('try', (data) => {
        io.to(data).emit('join', 'bang');
      })
    });
    

    ...但是,原始代码似乎仍然可以正常工作-几乎没有其他任何修改。留下问题,因为解决方法不是解决方案,这不是最佳实践!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 2013-12-21
      • 2017-11-20
      • 1970-01-01
      相关资源
      最近更新 更多