У меня есть несколько слушателей местоположения, таких как:
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
для него может еще не существовать, и чаще всего я получаю сообщение об ошибке return await dbroot.ref(
foodsOf / $.{uid} / $ {day} / totalCalories ).set(finalSum).then( (a) => {
return null ;
});
- строка в приведенном выше коде, которая говорит, что все до .set
равно NaN
.Я тоже пробовал .push(<childneme>).set(0)
, но эта ошибка сохраняется.У меня есть много триггеров, которые пытаются поддерживать БД в согласованном состоянии, например, очистка после вызова functions.auth.user().onDelete()
.Поэтому я думаю, что этот .onWrite()
-триггер может помешать удалению данных.Мой вопрос заключается в том, выглядит ли приведенный выше код корректно для поддержания поля totalCalories
в согласованном состоянии?
РЕДАКТИРОВАТЬ: я предполагаю, что триггер сбит с толку: когда пользователь удаляется, моя функция удаленияпытается удалить ветку mealsOf/<userId>
в целом, но это рассматривается как операция записи на всех ее дочерних элементах, поэтому запускается вышеуказанный триггер, и он устанавливает totalCalories
в ноль, но ссылка исчезает.Это объясняет, почему иногда ветвь mealsOf/<userId>
сохраняется, тогда как все пользовательские данные исчезают после удаления.