簡體   English   中英

Socket.io 不會發射到房間

[英]Socket.io won't emit to a room

我正在嘗試創建一個聊天大廳,用戶可以在其中創建私人房間,其他人可以通過 uuid 加入。 This is built with node.js and socket.io, and it seems as if io.to(room).emit('event', 'data') and io.sockets.to(room).emit('event', 'data')不工作,而io.emit('event', 'data')工作。 我的代碼可以在下面找到:

io.sockets.on('connection', (socket) => {
  socket.on('createRoom', function(data) {
      let room = new Room(data).create();

      let id = room.data.uuid
      socket.join(id)

      io.to(id).emit('roomcreated', {data: data, msg: 'Room Created'}) //Does not work!
      io.emit('roomcreated', {data: data, msg: 'Room Created'}) //This Works
  });
});

.join()的一個常見問題是它實際上是異步的。 它不會立即完成。 這可能是因為它被設計用於支持集群的多進程、基於 redis 的適配器,並且連接進程必須是異步的,因為它正在與其他進程通信。

您可以通過向.join()發送回調來解決您的問題,並且僅在房間完成加入后才發送到房間。

io.sockets.on('connection', (socket) => {
  socket.on('createRoom', function(data) {
      let room = new Room(data).create();

      let id = room.data.uuid
      socket.join(id, (err) => {
         if (err) {
             // do something here if the join fails
             console.log(err);
             return;
         }
         
         // call this only after the join has completed
         io.to(id).emit('roomcreated', {data: data, msg: 'Room Created'});
      });
  });
});

我不完全確定io.in(id).emit('roomCreated', {d: data}); 但我找到了一種解決方法。

我創建了一個名為 SOCKET_LIST 的所有 sockets 的 object,並為每個房間創建了一個包含該套接字 id 的數組:

var SOCKET_LIST = {};

io.sockets.on('connection', (socket) => {

  socket.id = Math.random();
  SOCKET_LIST[socket.id] = socket;

  socket.on('createRoom', function(data) {
      let room = new Room(data).create();
      room.data.users.push(socket.id)

      let id = room.data.uuid
      socket.join(id, (err) => {
        if(err) {
          return console.log(err);
        }
        room.data.users.forEach(i => {
          SOCKET_LIST[i].emit('roomcreated', {data: data, msg: 'Room Created'})
        })
      })

  });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM