Firebase.update失败:第一个参数在属性中包含未定义的参数

Firebase.update failed : first argument contains undefined in property

本文关键字:参数 包含 未定义 属性 失败 第一个 Firebase update      更新时间:2023-09-26

我有一个简单的Firebase函数,可以更新一些数据。然而,解释器说第一个参数在属性"users.tester1"中包含"未定义"。有人能帮我吗?

var objify = function() {
  var rv = {};
    for (var i = 0; i < arguments.length; ++i)
      rv[arguments[i]] = rv[arguments[i+1]];
    return rv;
}
    addUser("tester1", []);
var addUser = function(name, edges){
  if(!checkIfUsernameExists(name) && !checkIfNodeNameExists(name) && !checkIfEdgeNameExists(name)){
    var time = Firebase.ServerValue.TIMESTAMP;
    //HERE: I think the error is on this line 
    refs.users.update(objify(name, "filler"));
    refs.users.child(name).set({
      "id" : time,
      "edges" : "filler"
    });
    refs.users.child(name).child("edges").update({
      "to" : "filler",
      "from" : "filler"
    });
    addNode(new Node(name, time, name));
    for(var e in edges){
      refs.users.child(name).child("edges/to").update(objify(edges[e].name, true));
      addEdge(new Edge(edges[e].name, time, edges[e].to, edges[e].arrows));
      //TODO add a "from" edge so that you know who wants to eat you
    }
    refs.users.child(name).child("edges/to").set({"filler" : null});
  } else {
    alert("user/node/edge name taken.");
  }
};

当您将对象传递给Firebase时,属性的值可以是值或null(在这种情况下,属性将被删除)。它们不能是undefined,这是您根据错误传入的内容。

简单地孤立地运行这个片段就说明了问题:

var objify = function() {
  var rv = {};
    for (var i = 0; i < arguments.length; ++i)
      rv[arguments[i]] = rv[arguments[i+1]];
    return rv;
}
objify("name", "filler")

结果:

{名称:未定义,填充:未定义}

我的最佳选择是,您希望将键/值对作为偶数/奇数参数传递到objify中。在这种情况下,您希望将功能更改为:

var objify = function() {
  var rv = {};
    for (var i = 0; i < arguments.length; i+=2)
      rv[arguments[i]] = arguments[i+1];
    return rv;
}
objify("name", "filler")

结果:

{name:"填充物"}

要确保您的对象不包含任何未定义的道具,请使用以下简单技巧:

JSON.parse( JSON.stringify(YourJsonData ) )

有关更多信息,请查看此代码笔:http://codepen.io/ajmueller/pen/gLaBLX

当您尝试用未定义的值更新属性时,底层Firebase库会抛出错误。它将允许null(并基本上忽略它们)。

您需要您的原始转换器来确保它忽略所有原型方法和属性,并将undefined转换为null,或者完全删除具有未定义值的任何属性。

var addUser = function(name, edges){
  if(!checkIfUsernameExists(name) && !checkIfNodeNameExists(name) && !checkIfEdgeNameExists(name)){
    var time = Firebase.ServerValue.TIMESTAMP;
    //HERE: I think the error is on this line 
    refs.users.update(objify(name, "filler"));
    refs.users.child(name).set({
      "id" : time || null,
      "edges" : "filler" || null
    });
    refs.users.child(name).child("edges").update({
      "to" : "filler" || null,
      "from" : "filler" || null
    });
    addNode(new Node(name, time, name));

如上所述,如果您想将所有undefined值保存为firebase中的空值,则需要它们都是null

我采用这种方法来更正所有嵌套的值。

  //to search and replace    
    const replaceAll  =(s="",f="",r="")=>  s.replace(new RegExp(f.replace(/[-'/''^$*+?.()|[']{}]/g, '''$&'), 'g'), r)
    //to save 
   firebase.database().ref(`path`).update(JSON.parse(replaceAll(JSON.stringify(val),"undefined","null")))

我使用了Object.keys()方法:

var key1 = Object.keys(firstPaymentsData)[0],
    key2 = Object.keys(firstPaymentsData[key1])[0],
    uid  = firstPaymentsData[key1][key2].uid;