Javascript 带有Firebase的Chrome扩展中tabs.url的数据类型引发错误

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

我正在尝试将从chrome扩展中获得的选项卡url写入Firebase数据库。但是,FB会抛出一个错误,即:

extensions::uncaught_exception_处理程序:8响应制表符时出错。查询:错误:Firebase.update失败:第一个参数在路径/user posts/[object MouseEvent]/-KM8uJZHiNsgtQbNh13I中包含无效键([object MouseEvent])。键必须是非空字符串,并且不能包含“.”、“$”、“/”、“[”或“]”

mypopup.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);


 });

};
那么,它是否因为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。