谷歌云函数onCreate不写入数据库

时间:2020-04-16 13:28:08

标签: javascript node.js google-cloud-firestore google-cloud-functions

我为firebase创建了一个google函数,当添加新对话时,该函数将其附加到对话中每个用户的新集合下的Users表中,但是当该函数被触发时,数据库中到目前为止没有任何反应我已经在控制台上记录了tp值,以确保它们设置正确,并且我还尝试查看google函数日志,并且根据脚本运行的日志没有错误

这是该函数的代码

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp();

export const onConversationCreated = functions.firestore.document("Conversations/{conversationID}").onCreate((snapshot, context) => {
    let data = snapshot.data();
    let conversationID = context.params.conversationID;

    if(data){
        let members = data.members;
        for(let index = 0; index < members.length; index++){
            let currentUserID = members[index];
            let remainingUserIDs = members.filter((u: string) => u !== currentUserID)
            remainingUserIDs.forEach((m: string) =>  {
                return admin.firestore().collection("Users").doc(m).get().then((_doc) => {
                    let userData = _doc.data();
                    if(userData){
                        return admin.firestore().collection("Users").doc(currentUserID).collection("Conversations").doc(m).create({
                            "conversationID": conversationID,
                            "image": userData.image,
                            "unseenCount": 1,
                        });
                    }
                    return null;
                }).catch(() => {return null})
            });
        }
    }
    return null;
});

有人可以告诉我我的代码是否有问题,还是我必须授予功能写入云Firestore数据库的权限?

1 个答案:

答案 0 :(得分:0)

您没有正确处理诺言。您的函数需要返回一个可以解决所有异步工作的诺言。现在,它只是返回null,而不是等待任何工作完成。

所有 Firestore操作是异步的,并返回诺言。您将需要使用这些promise建立一个从函数返回的promise。这意味着每次查询和编写文档时,都会产生另一个承诺。

此外,您应该知道没有试图使用的方法create()添加文档。也许您打算使用set()来代替。如果代码尝试执行create(),则代码将崩溃。