Chrome 未捕获(在承诺中)错误:无法建立连接,接收端不存在

zazmityj  于 2022-12-06  发布在  Go
关注(0)|答案(3)|浏览(344)

关于这个问题还有很多问题有待解决,但我无法在我的案例中找到解释。下面是一个最小的测试案例:
这是我的货单json

{
  "manifest_version": 3,
  "name": "Test",
  "version": "1.0",
  "description": "Test extension",
  "icons": {
    "48": "dark.png"
  },
  "background": {
    "service_worker": "button.js"
  },
  "permissions": [
    "activeTab"
  ],
  "action": {
    "default_icon": "dark.png",
    "default_title": "DarkTheme"
  },
  "content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "js": [
        "dark.js"
      ]
    }
  ]
}
    • 按钮. js**
chrome.action.onClicked.addListener(tab => {
  console.log('clicked')
  chrome.tabs.sendMessage(tab.id, { value: false })
});
    • 深色. js**
chrome.runtime.onMessage.addListener(request => {
  console.log('received', request)
})

所以,基本上,我的侦听器在开始时就设置好了,只有当我按下按钮时才发送消息。为什么我按下按钮时会收到这个错误呢?

Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist.
  • 在Chromium版本100.0.4896.75(官方版本)快照(64位)上进行测试 *
3pvhb19x

3pvhb19x1#

谢谢你的帖子,我也有一个类似的问题,对于我的特殊问题,我找不到一个适当的答案,特别是谷歌Chrome扩展清单版本3。
在我的例子中,我想把chrome.idle.onStateChanged的空闲状态从background.js发送到contentScript.js。当我为reddit构建扩展时,contentScript.js只被注入到与reddit的URL模式匹配的页面中。

chrome.idle.onStateChanged.addListener(
  (browserActivityState) => {
    chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
        chrome.tabs.sendMessage(tabs[0].id, { browserActivityState: browserActivityState });
    });
  }
)

然后我得到了和你一样的错误。

未捕获(在承诺中)错误:无法建立连接。接收端不存在。

我在阅读错误消息时意识到,发生这种情况是因为我想向没有contentScript.js的页面发送消息。
我还注意到,当我打开Chrome但没有打开Reddit页面时,我会锁定屏幕,这会触发一个空闲更改事件,因此我的background.js会尝试向页面发送消息。
问题是,reddit在最后一个活动标签页中没有打开,因此该消息发送到的标签页没有注入contentScript.js
作为初步的解决方案,不确定这是否是最好的风格,但它做的工作,我检查,如果我发送消息的标签确实匹配的网页的URL,我注入的contentScript.jsif (tabs[0].url.match('https:\/\/.*.reddit.com\/.*'))

chrome.idle.onStateChanged.addListener(
  (browserActivityState) => {
    console.log('browserActivityState changed')
    chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
      if (tabs[0].url.match('https:\/\/.*.reddit.com\/.*')) {
        chrome.tabs.sendMessage(tabs[0].id, { browserActivityState: browserActivityState });
      }
    });
  }
)

这确保了我不会向带有**“无接收端”**的选项卡发送消息,并且到目前为止错误已消失。
也许你也可以从这个方向来解决你的问题。
我希望我能帮上点忙。

efzxgjgh

efzxgjgh2#

从内容脚本向后台发送消息时,应如下所示。

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
   chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
     console.log(response.farewell);
   });
});

链接:https://developer.chrome.com/docs/extensions/mv3/messaging/

zqry0prt

zqry0prt3#

我有一些问题,这遵循的文档在这里如上所述https://developer.chrome.com/docs/extensions/mv3/messaging/这工程的v3
popup.js

chrome.tabs.query({
    active: true,
    currentWindow: true
}, function(tabs) {
    chrome.scripting.executeScript({
        target: {
            tabId: tabs[0].id
        },
        function: sendData,
    });
});

const sendData = async () => {

    chrome.runtime.sendMessage({
        count: 12,
        data: []
    }, function(response) {
        console.log(response.received);
    });

}

Background.js

chrome.runtime.onMessage.addListener((data, sender, sendResponse) => {
    if (data) {
        // Do something amazing
    }
    sendResponse({
        received: true
    });
});

相关问题