在Chrome扩展中从background.js发送消息时出错

rks48beu  于 2023-05-11  发布在  Go
关注(0)|答案(1)|浏览(321)

我尝试从background.js向弹出窗口发送消息,但每当我尝试发送消息时,background.js都会给出以下错误:
Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist. .
我在background.js中有以下代码,这似乎导致了错误。

setInterval(()=>{
     chrome.runtime.sendMessage({
         command: "TEST0"
     });
},2000);

我的manifest.json如下:

{
  "manifest_version": 3,
  "name": "extension-test",
  "version": "1.0.0",
  "description": "Chrome extension test.",
  "icons": {

  },
  "chrome_url_overrides": {
  },

  "action": {
    "default_popup": "popup.html"
  },

  "permissions": [ "storage", "unlimitedStorage","activeTab","tabs","scripting"],
  "host_permissions": [ "<all_urls>" ],
  "background": {
    "service_worker": "js/background.js",
    "type": "module"
  },

  "minimum_chrome_version": "88"

}
x7yiwoj4

x7yiwoj41#

为了其他有同样问题的人而回答我自己的问题。这个问题是对扩展中不同元素之间的通信应该如何工作的概念性误解。
我希望我可以从扩展的不同部分(弹出窗口,后台)发送消息,并设置侦听器,如果不同部分恰好可用,就可以捕获消息。碰巧chrome扩展不喜欢这样。
因此,为了从background.js中获取数据到我的弹出窗口,而不是在background.js中使用chrome.runtime.sendMessage,我从弹出窗口发送了一条请求数据的消息,然后使用sendResponse函数返回所需的数据。
就像这样

后台

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {

        if(request === "some data please"){
             sendResponse("here is some data");
        }
    }
);

弹出

let response = await chrome.runtime.sendMessage("some data please");

// response === "here is some data"

相关问题