我有一堆位置侦听器,如下所示:
exports.recountTotalCaloriesOnUpdate = functions.database.ref('/mealsOf/{userId}/{day}/meals/{hour}/{mealId}')
.onUpdate(
async(change,context) => {
let uid= context.params.userId;
let day= context.params.day;
/*
let res= await dbroot.ref(`mealsOf/${uid}/${day}`).push('totalCalories').set(0).then( (e) => {
return null ;
});
*/
const collectionRef = change.after.ref.parent.ref.parent;
//const counterRef = dbroot.ref(`mealsOf/${uid}/${day}`).child('totalCalories');
let finalSum = await collectionRef.ref.once('value').then((snap) => {
let sum = 0;
snap.forEach((child) => {
console.log(child.val().numCalories);
sum = sum + parseInt(child.val().numCalories);
});
return sum;
});
/*
return await counterRef.ref.transaction((cnt) => {
return finalSum;
});
*/
return await dbroot.ref(`mealsOf/${uid}/${day}/totalCalories`).set(finalSum).then( (a) => {
return null ;
});
}
);
我的DB模式如下:
例如,即使在特定的一天创建了第一顿饭,我也确实知道它的totalCalories
字段可能还不存在,而且我经常会收到涉及{{1}的错误消息上面代码中的} mealsOf / $ {uid} / $ {day} / totalCalories return await dbroot.ref(
行指出).set(finalSum).then( (a) => {
return null ;
});
之前的所有内容都是.set
。我也尝试过NaN
,但此错误仍然存在。我有许多触发器试图使数据库保持一致状态,例如在.push(<childneme>).set(0)
被调用后清除。因此,我认为这种functions.auth.user().onDelete()
触发器可能会在清除数据时产生干扰。
我的问题是,上面的代码看起来对于保持.onWrite()
字段处于一致状态是正确的吗?
编辑:我的猜测是触发器很混乱:删除用户时,我的擦除功能会尝试完全删除分支totalCalories
,但这被视为对其所有子项的写入操作,这就是为什么启动上面的触发器并将mealsOf/<userId>
设置为零,但是引用消失了的原因。这可以解释为什么有时totalCalories
分支会保留下来,而所有与用户相关的数据在删除后都消失了。