【问题标题】:My messages disappear I get a new message or send messages我的消息消失了 我收到一条新消息或发送消息
【发布时间】:2021-08-28 02:43:04
【问题描述】:

我一直面临这个问题。

我的代码现在在收到新消息时会消失。我想让消息堆积起来,但是我尝试了很多方法,但我没有解决它们。如果您能告诉我该怎么做,我将不胜感激。

当我进入消息室时,我从 firebase 服务器收到 25 条消息。 如果超过 25 条消息,最后一条消息将消失。 消失消息。我不想喜欢这个......

我想要这个。

这是我的消失代码

const messageLimit = 25;
  const [messagesSnapshot] = useCollection(
    db
      .collection('chats')
      .doc(id)
      ?.collection('messages')
      .orderBy('timestamp', 'desc')
      .limit(messageLimit),
  );
    if (messagesSnapshot) {
      const snap = messagesSnapshot.docs;
      const startPost = messagesSnapshot.docs[messagesSnapshot.docs.length - 1];
      setStartAt(startPost);
      const messages = snap.map(message => ({
        id: message.id,
        user: message.data().user,
        messageInfo: {
          ...message.data(),
          timestamp: message.data().timestamp?.toDate().getTime(),
        },
      }));
      setMessagesList(messages);
    }
  const getMoreMessages = async () => {
    if (!lastPost) {
      setIsGetMessagesLoading(true);
      const query = await db
        .collection('chats')
        .doc(id)
        .collection('messages')
        .orderBy('timestamp', 'desc')
        .startAfter(startAt)
        .limit(messageLimit)
        .get();
      const messages = query.docs.map(message => ({
        id: message.id,
        user: message.data().user,
        messageInfo: {
          ...message.data(),
          timestamp: message.data().timestamp?.toDate().getTime(),
        },
      }));
      setStartAt(query.docs[query.docs.length - 1]);
      setMessagesList([...messagesList, ...messages]);
      setIsGetMessagesLoading(false);
      messages.length === 0 ? setLastPost(true) : setLastPost(false);
    }
  };
  useEffect(() => {
    showMessages();
  }, [messagesSnapshot]);

【问题讨论】:

  • 看起来您已将消息限制设置为 25 。所以一次只能有 25 条消息。如果您收到 10 条新消息,那么您的前 10 条消息将由于限制而丢失。
  • 感谢您回答我的问题。一开始只收到25条消息,不知道怎么堆积起来。

标签: reactjs firebase react-native google-cloud-firestore


【解决方案1】:

正如 Shyam 评论的那样,您已将查询限制为 25 条消息,因此当添加新消息时,最旧的消息将不在查询范围内。

您可以做的一件事是detect the changes between the updates,永远不要删除“过时”的文档。

文档中的示例:

db.collection("cities").where("state", "==", "CA")
    .onSnapshot((snapshot) => {
        snapshot.docChanges().forEach((change) => {
            if (change.type === "added") {
                console.log("New city: ", change.doc.data());
            }
            if (change.type === "modified") {
                console.log("Modified city: ", change.doc.data());
            }
            if (change.type === "removed") {
                console.log("Removed city: ", change.doc.data());
            }
        });
    });

所以您只处理了added(最初是每个文档)和可能的modified,但忽略removed

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多