【问题标题】:Firebase Cloud Functions and Firestore onCreate Listener ProblemFirebase Cloud Functions 和 Firestore onCreate 侦听器问题
【发布时间】:2020-08-24 23:42:38
【问题描述】:

我正在尝试制作一个聊天应用程序并使用 Firestore 和云功能。 我的 Firestore 结构是

Users -> name,username,email,etc...
Conversations -> members:[memberId1,memberId2]

当创建了一个新对话时,我正在向 Users/{memberId}/Conversation 集合添加一个对话集合,但它要么没有被创建,要么需要很长时间才能创建

这是我将对话信息添加到用户集合的云功能

    functions.firestore
  .document('Conversations/{conversationId}')
  .onCreate((snapshot:any, context:any) => {
    const data = snapshot.data();
    const conversationId = context.params.conversationId;

    if (data) {
      const members = data.members;
      if(!Array.isArray(members)){
        console.log("Members is not an array")
        return null;
      } 
      for ( const member of members) {
        const currentUserId = member;
        const remainingUserIDs = members.filter((u:string) => u !== currentUserId);
        remainingUserIDs.forEach(async (m:string) => {
            return admin
            .firestore()
            .collection('Users')
            .doc(m)
            .get()
            .then((_doc) => {
              const userData = _doc.data();
              if (userData) {
                return admin
                  .firestore()
                  .collection('Users')
                  .doc(currentUserId)
                  .collection('Conversations')
                  .doc(m)
                  .create({
                    conversationId: conversationId,
                    image: userData.profilePic,
                    username: userData.username,
                    unseenCount: 0,
                    userId: m,
                  });
              }
              return null;
            })
            .catch((err) => { 
              console.log(err);
              return null;
             });
        });
      }
    }
    return null;

  });

我在日志中看到它的调用没有错误,但没有添加数据,或者创建需要很长时间。 我究竟做错了什么 ? 另一个有趣的事情是我已经在模拟器上测试了这个功能,它工作正常,但在生产中存在问题

【问题讨论】:

  • create() 是异步函数吗?如果是,则在返回语句中添加await

标签: javascript firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

在从整个函数返回之前,您的代码不会等待 foreach 循环中的每个 Promise 解决。该函数只是立即返回 null 。调用 then 并 catch 不会使代码暂停。

你的函数must return a promise that resolves only after all other async work is finished。如果您不这样做,该功能将提前终止并在工作完成之前进行清理。这意味着您必须跟踪您在 foreach 循环中启动的所有承诺。我建议阅读这些以更好地理解问题并获得一些关于如何管理的想法:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2021-11-18
    • 2020-02-01
    • 1970-01-01
    • 2021-11-18
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多