-1

Ich versuche, eine Tab-URL zu schreiben, die ich von einer Chrome-Erweiterung der Firebase-Datenbank erhalte. Allerdings wirft FB einen Fehler, nämlich:Datatype von tabs.url in Chrome Erweiterung mit Firebase wirft Fehler

extensions::uncaught_exception_handler:8 Error in response to tabs.query: Error: Firebase.update failed: First argument contains an invalid key ([object MouseEvent]) in path /user-posts/[object MouseEvent]/-KM8uJZHiNsgtQbNh13I. Keys must be non-empty strings and can't contain ".", "#", "$", "/", "[", or "]"

Der entsprechende Code in meinem popup.js:

function writeNewPost(uid) { 

    chrome.tabs.query({currentWindow: true, active: true}, function (tabs) { 
    var urlvar = tabs[0].url; 

    var postData = { 
    uid: uid, 
    url: urlvar 
    }; 

    var newPostKey = firebase.database().ref().child('posts').push().key; 

    var updates = {}; 
    updates['/posts/' + newPostKey] = postData; 
    updates['/user-posts/' + uid + '/' + newPostKey] = postData; 

    return firebase.database().ref().update(updates); 


}); 

}; 

So ist es zu beklagen, weil die URL verbotene Zeichen enthält? Es muss irgendwie möglich sein, es zu konvertieren, um es dann in die Datenbank zu schreiben.

document.addEventListener("DOMContentLoaded", function() { 
    document.getElementById('clickme').addEventListener('click', writeNewPost); 
}); 

Die uid stammt aus den background.js, wo der Login behandelt wird:

Die Funktion durch diese wird aufgerufen.

var uid = firebase.auth().currentUser.uid; 

Und es gibt etwas zurück. Was mich beunruhigt ist, dass die gleiche Zeile in meinem popup.js Null zurückgibt.

Antwort

1

Nun, der problematische Teil ist uid und hat nichts mit chrome.tabs API-Aufruf zu tun - es kommt von außen (die Sie nicht zeigen).

Es sieht so aus, als ob Sie writeNewPost als Handler für einen Mausklick setzen - so wird ein MouseEvent Ereignisobjekt als erster Parameter übergeben. Das ist, wo dein Fehler ist.


Es macht wohl am meisten Sinn alle Operationen Ihrer Firebase im Hintergrund Seitenkontext zu konzentrieren - so, anstatt es zu versuchen, direkt zu nennen, pass a Message zum Hintergrund für Sie den Vorgang auszuführen - weil sonst Sie 2 Instanzen von Firebase API und Sie müssen Authentifizierung in beide.

+0

Ich sehe. Sie schlagen also eine Alternative zum Mausklick vor? Ich habe Probleme, einen anderen Weg zu finden, dies anzurufen. Der Code wurde oben aktualisiert. – ffritz

+0

Woher kommt die 'uid'? Das Problem ist, dass es als Argument der Funktion definiert ist. Es ist in Ordnung, die Funktion als Handler (oder von einem Handler) zu bezeichnen, aber "uid" muss von _irgendwo_ kommen. – Xan

+0

Es kommt von der background.js, aber ich habe gerade festgestellt, dass es Null in der popup.js (wo die WriteNewpost-Funktion befindet) ist. – ffritz

0

Das Problem war die UID ist Null während firebase.initializeApp() am Anfang von meinem popup.js. Durch das Aufrufen von firebase.auth(). CurrentUser.uid in der obigen Funktion wird die tatsächliche Benutzer-ID zurückgegeben: