首页 > 解决方案 > Firebase 函数在同一个 onCall 函数中读取和添加数据

问题描述

我有一个在单击按钮时触发的功能。根据 docId,我可以在 Firestore 中检索正确的下载 URL。但我也想更新我的“客户”集合中的特定字段(availableDownloads)。我无法让它工作。

这段代码工作正常。它返回下载网址。

exports.getDownloadUrl = functions.https.onCall(async(data, context) => {
    var docRef= await db.collection('projects').doc(data.docId);
    return docRef.get().then(function(doc){
        const downloadURL = doc.data().downloadURL;
        return downloadURL;
    }).catch(function(error) {
        // Handle error
    });
});

然而事实并非如此。它返回空

exports.getDownloadUrl = functions.https.onCall(async(data, context) => {
    var docRef= await db.collection('projects').doc(data.docId);
    return docRef.get()
    .then(async function(doc){
        const downloadURL = doc.data().downloadURL;
        const userRef = await db.collection('customers').doc(context.auth.uid);
        return userRef.update({
            availableDownloads: admin.firestore.FieldValue.increment(-1)
        }).then(()=> {
            return downloadURL;
        }).catch((error)=> {
            
        })
        
    }).catch(function(error) {
        // Handle error
    });
});

标签: javascriptnode.jsfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


我首先想到.update()的是一个异步函数,所以你需要一个awaituserRef.update(...).

您还应该考虑坚持使用箭头函数 ( () => {}) 或匿名函数 ( function () {}),但这只是一种风格说明。:)

ETA:正如 Frank van Puffelen 指出的那样,您不需要s来await简单地声明 DocumentReference,因为它们不是异步函数。(看线var docRef= await db.collection('projects').doc(data.docId);)。


推荐阅读