#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;
};
});
});