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

Datatype of tabs.url in Chrome Extension with Firebase throws error

本文关键字:数据类型 错误 url Chrome Firebase 扩展 程序 带有 tabs      更新时间:2023-09-26

我正在尝试编写一个从chrome扩展程序到Firebase数据库的标签网址。但是,FB 抛出一个错误,即:

extensions::uncaught_exception_handler:8 响应 tabs.query 时出错: 错误:Firebase.update 失败:第一个参数在路径/user-posts/[object MouseEvent]/-KM8uJZHiNsgtQbNh13I 中包含无效键([对象 MouseEvent])。键必须是非空字符串,并且不能包含"."、"#"、"$"、"/"、"["或"]"

我的弹出窗口中的相应代码.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 来自后台.js,用于处理登录。

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

它确实返回了一些东西。让我烦恼的是,我的弹出窗口中的同一行.js返回 null。

好吧,有问题的部分是uid的,与chrome.tabs API 调用无关 - 它来自外部

(您不显示)。

看起来您将writeNewPost设置为鼠标单击的处理程序 - 因此它被传递了一个MouseEvent事件对象作为其第一个参数。这就是你的错误所在。


将所有

Firebase 操作集中在后台页面上下文中可能是最有意义的 - 因此,与其尝试直接调用它,不如将消息传递到后台以为您执行操作 - 因为否则您有 2 个 Firebase API 实例,您需要在这两个实例中进行身份验证。

问题是在我的弹出窗口.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);

 });
};