You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用!==过滤聊天列表被屏蔽用户失效,仅排除单个用户

解决聊天列表过滤所有被屏蔽用户的问题

你的问题出在当前代码的逻辑上:现在你是遍历每个被屏蔽用户ID,单独对聊天列表做监听过滤,每次只处理一个被屏蔽ID。如果把判断条件改成!==,每次过滤只会排除当前遍历的那个ID的消息,其他被屏蔽ID的消息还是会被保留,而且多次监听的结果会叠加,导致看起来只排除了一个用户。

要一次性排除所有被屏蔽用户,应该先拿到完整的被屏蔽ID列表,然后在一次监听里过滤掉所有属于该列表的消息。下面是修正后的代码:

const checkBlockedUsers = async () => {
  // 获取被屏蔽用户ID列表
  const blockedUsersRef = collection(db, `users`, auth.currentUser?.uid, `blockedUsers`);
  const blockedUsersSnapshot = await getDocs(blockedUsersRef);
  const blockedUsersList = blockedUsersSnapshot.docs.map(doc => doc.data().blockedUser.id);

  // 只创建一次聊天列表的快照监听
  onSnapshot(
    query(collection(db, `convos`, convoId, `chats`), orderBy(`timestamp`, `asc`)),
    snapshot => {
      // 过滤出所有不在被屏蔽列表里的用户消息
      const filteredData = snapshot.docs.filter(doc => {
        const userId = doc.data().user.id;
        return !blockedUsersList.includes(userId);
      });

      // 处理过滤后的结果,比如打印未被屏蔽的用户名
      filteredData.map(doc => {
        console.log(doc.data().user.username);
      });
    }
  );
};

关键改动说明:

  • 用async/await替代then链式调用,代码逻辑更清晰,避免回调嵌套
  • 一次性获取所有被屏蔽用户ID,存入blockedUsersList数组
  • 只创建一次聊天列表的onSnapshot监听,避免重复监听造成的资源浪费和结果叠加
  • 过滤条件改为!blockedUsersList.includes(userId),直接判断当前消息的用户ID是否在被屏蔽列表中,一次性排除所有被屏蔽用户的消息

内容的提问来源于stack exchange,提问作者mac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:24:59