Javascript 云函数中的Firestore更新出错

Javascript 云函数中的Firestore更新出错,javascript,firebase,firebase-realtime-database,google-cloud-functions,google-cloud-firestore,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,Google Cloud Firestore,我尝试在Firebase上放置一个监听器,它将在Firestore中的匹配元素中复制一个值 exports.synchronizeDelegates = functions.database.ref(`delegates/{userId}/activities`).onUpdate((event) => { const userKey = event.data.ref.parent.key console.log("User Key:" + userKey

我尝试在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()
函数仍然错误
firestoreRef.update不是函数
我尝试了几种查询方法,但仍然存在此错误

在这种情况下,如何正确地查询并更新文档?

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

相反,您似乎希望使用它获取与查询匹配的文档列表,然后将其全部更新:

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))
}
请注意,我在函数中重写了其他一些不是最佳的东西


一般来说,熟悉云Firestore API文档是一个好主意,以了解您可以做什么。

您是否尝试过将该行替换为:
firestoreRef.update({activities:event.data.toJSON()})
?是的,我尝试链接更新()方法,它返回相同的错误。顺便说一句:我喜欢你使用云函数将Cloud Firestore同步到实时数据库。我不确定这有多讽刺@FrankvanPuffelen,但在我的情况下,我的RTDB中的
activities
字段由第三方供应商更新,该供应商通过API获得对我的数据库的写访问权。当我在客户端视图中使用Firestore时,这是我发现的最快的方法,因为此时我无法控制第三方开发。下一步很明显,将第三方提供商更新为在FireStore中编写并不是一件讽刺的事。很抱歉,如果它被认为是这样的。我一直想为我的一些项目编写这样的RTDB到Firestore同步函数,但是。。。太多其他的事情不断出现。很高兴看到至少有人能做到这一点。:-)感谢@Doug的输入
event.params.userId
也是一个很好的学习。