在 Firebase 云函数中批量处理 Promise

Posted

技术标签:

【中文标题】在 Firebase 云函数中批量处理 Promise【英文标题】:Handle Promises in a Batch write in Firebase cloud function 【发布时间】:2020-07-27 20:47:23 【问题描述】:

我在我的 firebase 函数中使用了以下函数,但我无法正确处理 Promise。

export const addNewMember_v0 = functions.https.onCall( async (data, context) => 
    if(context.auth)
        const memberName = data.memberName;
        const phone = data.phone;

        try 
            const querySnapshot = await db.collectionGroup('memberPrivate')
                .where('phone', '==', phone).get();
            if (querySnapshot === null) 
                const batch = db.batch();
                const memberDoc = db.collection('members').doc();
                const memberPrivateDoc = memberDoc.collection("memberPrivate").doc("info");

                batch.set(
                    memberDoc,
                    'memberName':memberName,
                );

                batch.set(
                    memberPrivateDoc,
                    'memberName':memberName
                );

                Promise.resolve(batch.commit());
                return available: true,  phone: phone, success: true;

             else 
                return available: false,  phone: phone, success: false;
            
        
        catch(error) 
            console.log(error);
            return error: error, success: false;
                
     else 
        return error: "Not Authenticated", success: false;
    
);

当我使用 firebase deploy 部署此代码时,我收到此错误:必须正确处理承诺

我应该改变什么来正确处理承诺?

我阅读了很多关于如何处理 Promises 的文档,但我一直没能做到。如果你能帮上忙,那就太好了。

【问题讨论】:

这能回答你的问题吗? What could this be about? [TsLint Error: "Promises must be handled appropriately"] 不确定为什么要调用 Promise.resolve()。这根本不适合这里。您的函数还需要返回一个 Promise,该 Promise 使用要发送给调用者的数据进行解析。 【参考方案1】:

batch.commit好像是一个异步函数,所以改一下

Promise.resolve(batch.commit());

await batch.commit();

【讨论】:

【参考方案2】:

我通过以下方法解决了它

try
    if(condition)
        const fetchPromises: Promise<any>[] = [];

        fetchPromises.push(batch.commit());
        fetchPromises.push(Promise.resolve(available: true,  phone: phone, success: true));
        return Promise.all(fetchPromises);
    

【讨论】:

以上是关于在 Firebase 云函数中批量处理 Promise的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 的云函数:序列化 Promise

如何通过云函数将图像存储在 Firebase 存储中

使用 Python 的 Firebase 云函数?

有没有办法批量读取firebase文档

如何在云函数内联编辑器中使用 Firebase 预定函数?

在 Firebase 云函数中解压 OAuth2 响应