Comment envoyer un message WebSocket sous condition ?
P粉933003350
P粉933003350 2023-09-18 14:56:33
0
1
647

J'utilise javascript et le package ws dans expressjs pour construire mon serveur.

Je suis en train de créer une application de chat pour mon portefeuille et, au départ, mon idée était de demander au client d'indiquer au serveur dans quels chats se trouve l'utilisateur (abonnements) et de les stocker dans un subscriptionsarray.

for (let i = 0; i < subscriptions.length; i++) {
        
          wss.clients.forEach((client) => {
            if (json.body.chatId === subscriptions[0][i]){
              client.send(message)
          }
        })
      }

C'est l'approche que je souhaite, mais le message est envoyé à chaque client connecté, ce qui est dommage.

L'objet d'abonnements est simplement un tableau contenant les identifiants des discussions dans lesquelles se trouve l'utilisateur.

Comment envoyer des messages uniquement aux clients qui sont en chat ?

P粉933003350
P粉933003350

répondre à tous(1)
P粉198749929

Tout d'abord, vous devez maintenir une méthode qui mappe chaque client à l'ID de chat auquel il est abonné. Vous pouvez le faire en utilisant JavaScript Map, où les clés sont des objets clients et les valeurs sont un tableau d'identifiants de discussion auxquels ils sont abonnés :

const subscriptionsMap = new Map();

Lorsqu'un client se connecte à WebSocket, il stocke ses informations d'abonnement dans souscriptionsMap. Lorsque les clients se déconnectent, assurez-vous de supprimer leurs abonnements de la carte :

wss.on('connection', (client) => {
  // 处理客户端连接

  // 假设`json.body.subscriptions`包含客户端订阅的聊天ID数组
  subscriptionsMap.set(client, json.body.subscriptions);

  // 处理客户端断开连接
  client.on('close', () => {
    subscriptionsMap.delete(client);
    // 执行任何必要的清理操作
  });
});

Désormais, lorsque vous recevez un message qui doit être envoyé à un client dans une discussion spécifique, parcourez les clients connectés et envoyez le message uniquement aux clients abonnés à l'ID de discussion correspondant :

// 假设`json.body.chatId`包含消息的聊天ID
const chatId = json.body.chatId;

wss.clients.forEach((client) => {
  if (subscriptionsMap.has(client) && subscriptionsMap.get(client).includes(chatId)) {
    client.send(message);
  }
});
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal