Подтвердить что ты не робот

Ошибка Firebase.update: первый аргумент содержит undefined в свойстве

У меня есть простая функция Firebase, которая обновляет некоторые данные. Однако интерпретатор говорит, что первый аргумент содержит "undefined" в свойстве "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.");
  }
};
4b9b3361

Ответ 1

Когда вы передаете объект 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")

Результаты в:

{name: undefined, filler: undefined}

Лучше всего, что вы хотите передать пары ключ/значение в 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: "filler" }

Ответ 2

Как сказано выше, для всех undefined значения должны быть null, если вы хотите сохранить их как пустые значения в firebase.

Я использую этот подход для исправления всех вложенных значений.

  //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")))