Firebase位置触发器,Reference.set失败:第一个参数在属性中包含NaN

时间:2018-11-21 05:10:21

标签: firebase firebase-realtime-database google-cloud-functions

我有一堆位置侦听器,如下所示:

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字段可能还不存在,而且我经常会收到涉及{{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分支会保留下来,而所有与用户相关的数据在删除后都消失了。

0 个答案:

没有答案