Wie sende ich eine WebSocket-Nachricht bedingt?
P粉933003350
P粉933003350 2023-09-18 14:56:33
0
1
645

Ich verwende Javascript und das WS-Paket in ExpressJS, um meinen Server zu erstellen.

Ich baue eine Chat-App für mein Portfolio und meine ursprüngliche Idee war, dass der Client dem Server mitteilt, in welchen Chats sich der Benutzer befindet (Abonnements) und diese in einem subscriptionsArray speichert.

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

Das ist der Ansatz, den ich möchte, aber die Nachricht wird an jeden verbundenen Client gesendet, was schade ist.

Das Abonnementsobjekt ist nur ein Array, das die IDs der Chats enthält, in denen sich der Benutzer befindet.

Wie sende ich Nachrichten nur an Kunden, die im Chat sind?

P粉933003350
P粉933003350

Antworte allen(1)
P粉198749929

首先,您需要维护一个将每个客户端与其订阅的聊天ID进行映射的方法。您可以使用JavaScript的Map来实现,其中键是客户端对象,值是他们订阅的聊天ID的数组:

const subscriptionsMap = new Map();

当客户端连接到WebSocket时,将其订阅信息存储在subscriptionsMap中。当客户端断开连接时,确保从映射中删除他们的订阅:

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

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

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

现在,当您收到需要发送给特定聊天中的客户端的消息时,遍历连接的客户端,并仅将消息发送给订阅相关聊天ID的客户端:

// 假设`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);
  }
});
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage