云功能中的Firestore更新出错

问题描述 投票:2回答:1

我尝试在Firebase上放置一个侦听器,它将复制Firestore中匹配元素中的值。

exports.synchronizeDelegates = functions.database.ref(`delegates/{userId}/activities`).onUpdate((event) => {
        const userKey = event.data.ref.parent.key

        console.log("User Key:" + userKey)

        return admin.database().ref(`delegates/${userKey}/email`).once('value', snapshot => {

            let email = snapshot.val()

            console.log("Exported Email:" + email)

            const userRef = admin.firestore().collection('users')
            const firestoreRef = userRef.where('email', "==", email)

            firestoreRef.onSnapshot().update({ activities: event.data.toJSON() })

        }).then(email => {
            console.log("Firebase  Data successfully updated")
        }).catch(err => console.log(err))
    }
)

这个函数能够检索和定位在firestore中定位正确文档所需的元素,但是.update()function仍然是错误firestoreRef.update is not a function我尝试了几种方法来查询,但我仍然有这个错误。

如何正确查询然后在此方案中更新文档?

javascript firebase firebase-realtime-database google-cloud-functions google-cloud-firestore
1个回答
4
投票

onSnapshot()Query方法引入了一个持久的监听器,每次有新的QuerySnapshot可用时都会触发该监听器。它一直这样做,直到听取者取消订阅。这种行为绝对不是你想要的。此外,您的代码尝试调用QuerySnapshot上没有update()方法。

相反,看起来您希望使用get()来获取与您的查询匹配的文档列表,然后将它们全部更新:

exports.synchronizeDelegates = functions.database.ref(`delegates/{userId}/activities`).onUpdate((event) => {
    const userId = event.params.userId
    console.log("User Key:" + userKey)

    return admin.database().ref(`delegates/${userId}/email`).once('value', snapshot => {

        let email = snapshot.val()

        console.log("Exported Email:" + email)

        const usersRef = admin.firestore().collection('users')
        const query = usersRef.where('email', "==", email)

        const promises = []
        query.get().then(snapshots => {
            snapshots.forEach(snapshot => {
                promises.push(snapshot.ref.update(event.data.val()))
            })
            return Promise.all(promises)
        })
    }).then(email => {
        console.log("Firebase  Data successfully updated")
    }).catch(err => console.log(err))
}

请注意,我在函数中重写了一些非最佳的东西。

通常,熟悉Cloud Firestore API文档以了解您可以执行的操作是个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.