Firebase云功能和Firestore onCreate侦听器问题

时间:2020-08-24 23:42:38

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

我正在尝试制作一个聊天应用程序,并使用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;

  });

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

1 个答案:

答案 0 :(得分:0)

您的代码在从整体函数返回之前没有等待foreach循环中的每个promise解析。该函数只是立即返回null。然后调用并兑现承诺不会使代码暂停。

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