【问题标题】:Firebase 'set' function deletes entire nodeFirebase 'set' 函数删除整个节点
【发布时间】:2019-07-20 12:18:32
【问题描述】:

我正在尝试使用 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 设置值时,它会删除整个节点weeklyTriggers,然后创建@ 987654327@

如何确保weeklyTriggers 不会被删除?

编辑:

更新代码

exports.doSome = functions.database.ref('/users/{userId}/dataSets/{dataSetNo}').onWrite(
 async (change, context) => {
  const userId = context.params.userId;
  const yearNo = context.params.yearNo;
  const weekNo = getWeekNo();
  var ref = change.after.ref.root.child('users');
  var dataPath = `${userId}/weeklyTriggers/${dataSetNo}/${weekNo}/data`;

  var foo={};
  foo[dataPath] = "Some data";

  return ref.update(foo);
});

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案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'
    });
    

    【讨论】:

    • 嘿弗兰克,我尝试了你的建议。它仍然会删除节点weeklyTriggers 并重新创建它。
    【解决方案2】:

    云函数应该返回一个promise,否则它可能在操作成功完成之前被终止,这可能会导致意想不到的结果。尝试将 return 添加到您的 set() 操作。

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

    或者你也可以添加await,但在这种情况下它完全没用

    【讨论】:

    • 感谢 Teempy。我试过了,仍然删除并重新创建节点。我已经用我的代码更新了帖子。
    • 很奇怪。我试图在我的项目中表示相同的情况并对其进行了一些简化:i.imgur.com/7D9IvFj.jpg,一切都按预期工作,我可以写入数据集并且该函数只添加一个新值而不删除任何内容。该函数在不同情况下的行为是否不同?功能日志中是否有任何消息?
    • 这很奇怪。不,功能日志中没有消息。让我仔细检查一下前端,看看那里是否有任何可能触发这种情况的事情发生。感谢您不厌其烦地把它放在一起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    相关资源
    最近更新 更多