Javascript 云函数中的Firestore更新出错
我尝试在Firebase上放置一个监听器,它将在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
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
也是一个很好的学习。