我遇到一个问题,即我的Cloud Function脚本检测到Firestore数据库中特定用户的写入更改。 这个想法是,在触发写入更改时,我会为该用户计算一个新的总值,即,当从本地用户处写入新的步行距离时,我会在云函数上计算一个新的总距离。不幸的是,这似乎是因为我的脚本检测到正确的更改,但随后为数据库中的所有uid /文档写入了新值。我只想更新检测到更改的用户的字段。我在这里做错了什么? 我检查uid值是更改已注册的实际用户ID,这是因为调试后我在控制台日志中进行了检查。
module.exports.LogSummary = functions.firestore
.document('Logs/{userId}').onWrite((change, context) => {
const uid = context.params.userId;
let TotalDistance = 0;
TotalDistance =
change.after.data().Running_Distance +
change.after.data().Walking_Distance;
return db
.collection('Logs')
.doc(uid)
.update({
Total_Distance_Cloud: TotalDistance})
.catch(console.error);
});
答案 0 :(得分:0)
请参阅:
如果您不关心触发的事件的类型,则可以使用带通配符的onWrite()函数来侦听Cloud Firestore文档中的所有更改。如果创建,更新,或删除:
每个函数调用都与Cloud Firestore数据库中的特定文档相关联。您可以在返回给函数的快照的ref属性中将该文档作为DocumentReference进行访问。
注意!!!
注意:每当您写入触发功能的同一文档时,都有创建无限循环的风险。请谨慎操作,并确保在不需要更改时安全退出该功能。
如果发生无限循环,则应在Google云控制台上删除云功能。
检查非无限循环,然后尝试以下代码。
module.exports.LogSummary = functions.firestore
.document("Logs/{userId}")
.onWrite((change, context) => {
// If the document does not exist, it has been deleted.
if (!change.after.exists) {
return;
}
// Retrieve the current value
const data = change.after.data();
const totalDistance = data.Running_Distance + data.Walking_Distance;
// This is crucial to prevent infinite loops.
if (data.Total_Distance_Cloud === totalDistance) {
return;
}
// Then return a promise of a set operation to update
return change.after.ref.update({
Total_Distance_Cloud: totalDistance
});
});