2016-01-10 10 views
19

Ich habe eine einfache Firebase-Funktion, die einige Daten aktualisiert. Der Interpreter sagt jedoch, dass das erste Argument "undefined" in der Eigenschaft "users.tester1" enthält. Kann mir bitte jemand helfen?Firebase.update fehlgeschlagen: erstes Argument enthält undefined in Eigenschaft

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

Antwort

29

Wenn Sie ein Objekt auf Firebase übergeben, können die Werte der Eigenschaften ein Wert oder null sein (in diesem Fall wird die Eigenschaft entfernt werden). Sie können nicht undefined sein, was Sie entsprechend dem Fehler übergeben.

einfach diesen Schnipsel in Isolation ausgeführt zeigt das Problem:

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

Ergebnisse in:

{name: undefined, Füllstoff: undefined}

Meine beste Wette ist, dass Sie möchten Schlüssel/Wert-Paare in objify als gerade/ungerade Parameter übergeben. In diesem Fall sollten Sie die Funktion ändern:

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

Ergebnisse in:

{name: "Füllstoff"}

+1

Thanks so much! Ich bin kein Backend-Webentwickler oder irgendetwas; Ich bin nur ein Hobbyist. Meine Freunde und ich machen Spiele mit Unity. Dieses Projekt ist nur etwas, das wir für cool hielten. – jonathanhuo11

+0

Ich hatte die Variablen 'pub.email',' pub.displayName' usw. deklariert. Ich habe diesen Fehler bekommen. Ich habe 'pub.email = null;' beispielsweise für diese Deklarationen hinzugefügt, und jetzt ist der Fehler verschwunden. '.onAuthStateChanged' füllt sie oder nicht, abhängig davon, ob der Benutzer angemeldet ist und dies funktioniert. –

0

Wie oben gesagt, müssen Sie alle undefined Werte Geben Sie null ein, wenn Sie sie als leere Werte in Firebase speichern möchten.

Ich nehme diesen Ansatz, um alle verschachtelten Werte zu korrigieren.

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

um sicherzustellen, dass Ihr Objekt enthält keine undefinierten Requisiten diesen einfachen Trick:

JSON.parse(JSON.stringify(YourJsonData)) 

Für weitere Informationen zu diesem codePen einen Blick: http://codepen.io/ajmueller/pen/gLaBLX

Verwandte Themen