Ошибка 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.");
}
};
Ответы
Ответ 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")))