Триггеры местоположения Firebase, Reference.set не удалось: первый аргумент содержит NaN в свойстве - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть несколько слушателей местоположения, таких как:

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-схема выглядит следующим образом:

enter image description here

Например, когда создается первый прием пищи даже для определенного дня, я понимаю, что поле 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> сохраняется, тогда как все пользовательские данные исчезают после удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...