Firebase“设置”功能删除整个节点

时间:2019-07-20 12:18:32

标签: javascript firebase firebase-realtime-database

我正在尝试使用Firebase Cloud函数来运行一些基于触发器的函数。

我的数据库看起来像这样

users{
     userId{
            dataSets{
               dataSet1 { //data } 
               dataSet2 { //data }
            }
            weeklyTriggers { 
                 dataSet1{
                    weekNo{
                       //updates
                    }
                 }
            }
      }
}

我正在使用onWrite函数作为特定节点上的触发器:

exports.doSome = functions.database.ref('/users/{userId}/dataSets/{dataSetNo}').onWrite(
async (change, context) => {
  const userId = context.params.userId;
  const dataSetNo = context.params.dataSetNo;
  const weekNo = getWeekNo(); //is a custom function works fine
  var databaseRef = admin.database().ref('users');
  databaseRef.child(userId).child('weeklyTriggers').child(dataSetNo).child(weekNo).set({
    data: 'Some Data'
  });
});

我遇到的问题是,当我对dataSet1进行更新时,它会设置该值,但是,当我为dataSet2进行设置时,它将删除整个节点{{1 }},然后创建weeklyTriggers

如何确保不会删除weeklyTriggers/dataSet2/30/

编辑:

更新的代码

weeklyTriggers

2 个答案:

答案 0 :(得分:1)

如果您在某个位置呼叫set(),则该位置的所有数据将被您在呼叫中提供的数据替换。如果只想更新该位置下的某些属性,请使用update()

例如:

databaseRef.child(userId).child('weeklyTriggers').child(dataSetNo).child(weekNo).update({
  data: 'Some Data'
});

您可以提供指向update的路径,以更深地更新JSON中的属性。因此,上述操作也可以通过以下方式完成:

databaseRef.update({
  `${userId}/weeklyTriggers/${dataSetNo}/${weekNo}/data`: 'Some Data'
});

答案 1 :(得分:0)

Cloud函数应该返回一个Promise,否则可以在操作成功完成之前终止它,这可能会导致意外结果。尝试将return添加到set()操作中。

return databaseRef.child(userId).child('weeklyTriggers').child(dataSetNo).child(weekNo).set({
    data: 'Some Data'
  });

或者您也可以添加await,但是在这种情况下,它非常无用