"试图使用断开连接的端口对象“;铬合金延长件中的长寿命连接

"Attempting to use a disconnected port object" with Long-lived connections in chrome extension

本文关键字:连接 金延长 quot 断开 对象      更新时间:2023-09-26

我得到这个错误Uncaught Error: Attempting to use a disconnected port object

当我第一次打开弹出页面时,之间有一个长期的连接

内容脚本<->背景页<->弹出页面。

当我点击浏览器动作图标时,弹出页面将通过后台页面从服务器获取一些信息进行初始化。

第一次点击时一切都很好,但如果我关闭弹出窗口并再次点击,它就无法从后台页面获取信息。

这是我的代码

弹出页面

window.onload = function() {
var port = chrome.runtime.connect({name: "stadium"});
chrome.tabs.query({ currentWindow: true, active: true }, function callback(tabs){
  console.log("send TabID to background page");
  port.postMessage({"method":"sendTabId","content": tabs[0].id});
});

port.postMessage({"method" : "initialPopup"});//initilaize request
port.onMessage.addListener(function(msg) {
  console.log("somthing");
    if (msg.method == "updatePage"){
               initialize....
             }
    else if(...){...}
 });

和背景页

    var socket = io.connect('http://localhost:3700/');
    chrome.tabs.onRemoved.addListener(function(tabId,removeInfo){
      if(tabId==stadiumTabId){
        //change to the original style popup page
        chrome.browserAction.setPopup({"popup":"../pages/popup_out_guest.html"});  
      }
    });
    chrome.runtime.onConnect.addListener(function(port) {
      console.assert(port.name == "stadium"); 
      port.onMessage.addListener(function(msg) {  
        if (msg.method == "initialPopup"){  //get the initilaize request
            socket.emit('updateMatchInfo',"haha");
            socket.on('getUpdate',function(matchInfo){
                       console.log("background page get data from server");
                        port.postMessage({"method":"updatePage","content": matchInfo});                         
                      });
        }
        else if (msg.method == "something"){ 
           //insert content scripts
          chrome.tabs.executeScript({file: 'js/content_scripts.js', allFrames: true});
          //change to another popup page style
          chrome.browserAction.setPopup({"popup":"../pages/popup_in_guest.html"});               
        }
  });//port.onMessage.addListener
});//onConnect.addListener

错误发生在后台页面的这一行

 port.postMessage({"method":"updatePage","content": matchInfo}); 

我已经检查了服务器是否正确地将数据发送到后台页面,但就是无法找出错误。

谢谢你的帮助!!

你是不是顺便使用了Awesome屏幕截图?我经常收到错误消息,但一旦我禁用了该扩展,消息就消失了:)

每当关闭弹出窗口时,它显示的页面也会被关闭/销毁,这与总是运行的后台页面不同。

因此,当其中一方不复存在时,一个长期存在的连接就会断开。

您应该从使用长期连接切换到使用简单消息。当它打开时,弹出窗口请求当前状态,后台页面广播状态更新。如果弹出窗口没有监听更新(因为它没有打开),则不会造成任何伤害。