首页 > 解决方案 > 为什么我的 Firebase 更新功能并不总是有效?

问题描述

我试图弄清楚为什么我的firebase作弊功能总是在创建但是当像打开它调用create函数的聊天时立即发送一条消息,该消息将不会被保存,因为我的功能还没有准备好,所以我怎么能做到这一点?这是我的功能。

export const onConversationCreated = functions.firestore.
    document("Conversations/{conversationID}").onCreate((snapshot, context) => {
      const data = snapshot.data();
      const conversationID = context.params.conversationID;
      if (data) {
        const members = data.members;
        for (let index = 0; index < members.length; index++) {
          const uid = members[index];
          const remainingUserIDs = members.filter((u: string) => u !== uid);
          remainingUserIDs.forEach((m: string) => {
            return admin.firestore().
                collection("profile").doc(m).get().then((_doc) => {
                  const userData = _doc.data();
                  if (userData) {
                    return admin.firestore().collection("profile")
                        .doc(uid).collection("Conversations").doc(m).create({
                          "conversationID": conversationID,
                          "url": userData.url,
                          "name": userData.username,
                          "unseenCount": 0,
                        });
                  }
                  return null;
                }).catch(() => {
                  return null;
                });
          });
        }
      }
      return null;
    });


export const onConversationUpdated = functions.firestore
    .document("Conversations/{conversationID}").onUpdate((change, context) => {
      const data = change?.after.data();
      if (data) {
        const members = data.members;
        const lastMessage = data.messages[data.messages.length - 1];
        for (let index = 0; index < members.length; index++) {
          const uid = members[index];
          const remainingUserIDs = members.filter((u: string) => u !== uid);
          remainingUserIDs.forEach((u: string) => {
            return admin.firestore().collection("meinprofilsettings")
                .doc(uid).collection("Conversation").doc(u).update({
                  "lastMessage": lastMessage.message,
                  "timestamp": lastMessage.timestamp,
                  "type": lastMessage.type,
                  "lastmessageuid": lastMessage.senderID,
                  "unseenCount": admin.firestore.FieldValue.increment(1),
                });
          });
        }
      }
      return null;
    });

所以再次创建是正确的工作。它只是需要一些时间。当我在调用创建函数时立即写一条消息并发送它时,在创建函数完成之前,这条消息不会被保存,那么我必须再次发送消息

在此处输入图像描述

标签: flutterdartgoogle-cloud-firestoregoogle-cloud-functions

解决方案


您的错误的原因是您没有async正确等待任务的执行。不幸的是,forEach不支持async,所以我们需要将您的代码改写为这样的:

export const onConversationCreated = functions.firestore
  .document("Conversations/{conversationID}")
  .onCreate((snapshot, context) => {
    const data = snapshot.data();
    const promises: Promise<any>[] = [];
    const conversationID = context.params.conversationID;
    if (data) {
      const members = data.members;

      for (let index = 0; index < members.length; index++) {
        const uid = members[index];
        const remainingUserIDs = members.filter((u: string) => u !== uid);

        remainingUserIDs.forEach((m: string) => {
          promises.push(
            admin
              .firestore()
              .collection("profile")
              .doc(m)
              .get()
              .then((_doc) => {
                const userData = _doc.data();
                if (userData) {
                  return admin
                    .firestore()
                    .collection("profile")
                    .doc(uid)
                    .collection("Conversations")
                    .doc(m)
                    .create({
                      conversationID: conversationID,
                      url: userData.url,
                      name: userData.username,
                      unseenCount: 0,
                    });
                }
                return null;
              })
          );
        });
      }
    }
    return Promise.all(promises);
  });

export const onConversationUpdated = functions.firestore
  .document("Conversations/{conversationID}")
  .onUpdate((change, context) => {
    const data = change?.after.data();
    const promises: Promise<any>[] = [];
    if (data) {
      const members = data.members;

      const lastMessage = data.messages[data.messages.length - 1];
      for (let index = 0; index < members.length; index++) {
        const uid = members[index];
        const remainingUserIDs = members.filter((u: string) => u !== uid);
        remainingUserIDs.forEach((u: string) => {
          promises.push(
            admin
              .firestore()
              .collection("meinprofilsettings")
              .doc(uid)
              .collection("Conversation")
              .doc(u)
              .update({
                lastMessage: lastMessage.message,
                timestamp: lastMessage.timestamp,
                type: lastMessage.type,
                lastmessageuid: lastMessage.senderID,
                unseenCount: admin.firestore.FieldValue.increment(1),
              })
          );
        });
      }
    }
    return Promise.all(promises);
  });

我们Promise.all()甚至可以async并行运行您的所有任务,以更快地完成功能并节省执行时间。


推荐阅读