Javascript 带有Firebase的Chrome扩展中tabs.url的数据类型引发错误
我正在尝试将从chrome扩展中获得的选项卡url写入Firebase数据库。但是,FB会抛出一个错误,即: extensions::uncaught_exception_处理程序:8响应制表符时出错。查询:错误:Firebase.update失败:第一个参数在路径/user posts/[object MouseEvent]/-KM8uJZHiNsgtQbNh13I中包含无效键([object MouseEvent])。键必须是非空字符串,并且不能包含“.”、“$”、“/”、“[”或“]” mypopup.js中相应的代码:Javascript 带有Firebase的Chrome扩展中tabs.url的数据类型引发错误,javascript,google-chrome-extension,firebase,firebase-realtime-database,Javascript,Google Chrome Extension,Firebase,Firebase Realtime Database,我正在尝试将从chrome扩展中获得的选项卡url写入Firebase数据库。但是,FB会抛出一个错误,即: extensions::uncaught_exception_处理程序:8响应制表符时出错。查询:错误:Firebase.update失败:第一个参数在路径/user posts/[object MouseEvent]/-KM8uJZHiNsgtQbNh13I中包含无效键([object MouseEvent])。键必须是非空字符串,并且不能包含“.”、“$”、“/”、“[”或“]” m
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);
});
};
那么,它是否因为url包含禁止使用的字符而抱怨?必须以某种方式转换它,然后将其写入数据库
通过以下方式调用该函数:
document.addEventListener("DOMContentLoaded", function() {
document.getElementById('clickme').addEventListener('click', writeNewPost);
});
uid来自处理登录的background.js,
var uid = firebase.auth().currentUser.uid;
它确实返回了一些东西。
困扰我的是,我的popup.js中的这一行返回null。好吧,有问题的部分是
uid
,与chrome.tabs
API调用无关-它来自外部(您没有显示)
它看起来像是将writeNewPost
设置为鼠标单击的处理程序-因此它将传递一个MouseEvent
事件对象作为其第一个参数。这就是你的错误所在
将所有Firebase操作集中在后台页面上下文中可能是最有意义的——因此,与其尝试直接调用它,到后台为您执行操作-因为否则您有两个Firebase API实例,您需要在这两个实例中进行身份验证。问题是在my popup.js开头的Firebase.initializeApp()期间uid为空。在上述函数中调用firebase.auth().currentUser.uid将返回实际的uid:
function writeNewPost() {
chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
var urlvar = tabs[0].url;
var uid = firebase.auth().currentUser.uid; //This
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);
});
};
我懂了。那么你是在建议鼠标点击事件的替代方案?我很难找到另一种方式来称呼它。代码已在上面更新。
uid
来自哪里?问题是它被定义为函数的参数。可以将函数作为处理程序(或从处理程序)调用,但是uid
必须来自某个地方。它来自background.js,但我刚刚注意到它在popup.js(writenewpost函数所在的位置)中为null。