io.to не отправлять конкретному клиенту

#javascript #socket.io

Вопрос:

Я пытаюсь отправить сообщение «newAllowedUserAlert» определенному пользователю. Однако проблема в том, что он вообще не отправляется пользователю. Для отладки я проверил, правильно ли определен userToAllow, и это было так. Я подозреваю, что проблема в том, что я устанавливаю пользовательский идентификатор, но я удостоверяюсь, что ни один пользователь не приходит дважды, чтобы не было дубликатов идентификаторов. Прав ли я, полагая, что виной всему customId, или это что-то другое?

На стороне сервера:

 io.on("connection", function (socket) {
    socket.on("newUser", async function (userData) {
      const {isUserHost, customId} = userData;

      // Maybe only use original ID instead of customId?
      socket.id = customId;

      const [room, email] = customId.split(" ");
      const roomCriteria = {uuid: room};

      await Call.updateOne(roomCriteria, {
        $push: {
          currentUserEmails: email
        }
      });
      
      socket.join(room);

      if (isUserHost) {
        socket.on("newAllowedUserId", async function (userToAllow) {
          const emailToAllow = userToAllow.split(" ")[1];

          await Call.updateOne(roomCriteria, {
            $push: {
              allowedUserEmails: emailToAllow
            }
          });

          io.to(userToAllow).emit("userIsAllowedAlert", "");
        });
      };
    });
  });
 

Сторона клиента:

 socket.on("userIsAllowedAlert", function () {
              alert("You are allowed!");
            });
 

Ответ №1:

Поддерживайте ссылку на сокет каждого клиента, который индексируется customId, и при необходимости отправляйте им.

 const myClientList = {};

  io.on("connection", function (socket) {
    socket.on("newUser", async function (userData) {
      const {isUserHost, customId} = userData;

      // Maybe only use original ID instead of customId?
      socket.id = customId;

      const [room, email] = customId.split(" ");
      const roomCriteria = {uuid: room};

      await Call.updateOne(roomCriteria, {
        $push: {
          currentUserEmails: email
        }
      });
      
      socket.join(room);

      if (isUserHost) {
        socket.on("newAllowedUserId", async function (userToAllow) {
          const emailToAllow = userToAllow.split(" ")[1];

          await Call.updateOne(roomCriteria, {
            $push: {
              allowedUserEmails: emailToAllow
            }
          });

          const userToAllowSocket = myClientList[userToAllow];

          if (userToAllowSocket) {
            userToAllowSocket.emit("userIsAllowedAlert", "");
          };
        });
      } else {
        myClientList[customId] = socket;
      };
    });
  });