2016-01-10 2 views
19

У меня есть простая функция Firebase, которая обновляет некоторые данные. Однако интерпретатор говорит, что первый аргумент содержит «undefined» в свойстве «users.tester1». Может кто-нибудь мне помочь?Firebase.update failed: первый аргумент содержит неопределенные свойства

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."); 
    } 
}; 

ответ

29

При передаче объекта в Firebase, значения свойств может быть значением или нулевым (в этом случае свойство будет удалено). Они не могут быть 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") 

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

{имя: "наполнитель"} сказал выше

+1

Спасибо так много! Я не сторонний веб-разработчик или что-то еще; Я просто любитель. Мои друзья и я обычно играем в Unity. Этот проект просто то, что мы думали, было круто. – jonathanhuo11

+0

Я объявил переменные 'pub.email',' pub.displayName' и т. Д. Я получил эту ошибку. Например, я добавил 'pub.email = null;' для этих объявлений, и теперь ошибка исчезла. '.onAuthStateChanged' заполняет их или не зависит от входа пользователя в систему, и это работает. –

0

Мол, вам нужно все 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"))) 
0

, чтобы убедиться, что ваш объект не содержит какой-либо неопределенный реквизит использовать этот простой трюк:

JSON.parse(JSON.stringify(YourJsonData)) 

Для получения дополнительной информации посмотри на этом codePen: http://codepen.io/ajmueller/pen/gLaBLX

Смежные вопросы