【问题标题】:Why my firebase update function is not always working?为什么我的 Firebase 更新功能并不总是有效?
【发布时间】:2021-08-02 04:01:12
【问题描述】:

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

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;
    });

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

enter image description here

【问题讨论】:

  • 您可以将函数设为Future,然后在其上应用whenComplete(),仅在函数执行时处理。或await 为您的功能拨打新电话之前
  • 怎么样?你可以编辑我的代码吗?

标签: flutter dart google-cloud-firestore google-cloud-functions


【解决方案1】:

您的错误的原因是您没有正确等待您的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 任务,以更快地完成功能并节省执行时间。

【讨论】:

  • 您的意思是 Promise,因为它说找不到名称“promises”。您的意思是“Promise”吗?哈哈
  • 抱歉 const promises = [] 处于这种状态。我更新了代码。你能再试一次吗?
  • 您是否再次复制了整个代码? promises 是我们在代码中定义的一个常量。无法想象在函数启动时我们定义它之前找不到它。你能给我完整的错误信息吗?
  • 我更新了一张图片,你可以看看它的样子
  • 啊,那是打字稿的东西;)我又改了答案。
猜你喜欢
  • 2011-04-24
  • 2019-08-02
  • 2016-11-11
  • 2020-08-10
  • 2011-06-18
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多