如何解决“未经检查的runtime.lastError:在收到响应之前关闭消息端口”的Chrome问题?


138

我正在为我的项目使用VueJS和Laravel。这个问题最近开始显示,甚至在旧的git分支中也显示。

此错误仅在Chrome浏览器中显示。


3
您有广告拦截器吗?
Maelig

1
检查我对其他请求的回答:stackoverflow.com/questions/53919591/…–
Dolfiz

3
谢谢大家,问题是扩展名“ Video Downloader professional”。
Triumf Maqedonci

2
对我一样,Video Downloader Professional会产生此类错误
sinedsem19年

1
投票结束,因为公认的解决方案是配置问题,与解决/理解编程问题的原因无关。
格雷格·多姆詹

Answers:


162

我禁用了Chrome中所有已安装的扩展程序-适用于我。我现在已清除控制台,没有错误。


20
MeddleMonkey禁用
terantul

6
我遇到此问题,是由Norton Safe Search Extension引起的
Boardy

7
在我的情况下延长是谷歌发布商工具栏
莱昂德罗·卡斯特罗

1
我的扩展名“ Video Speed Controller”处于损坏状态。修复它,然后错误消失了。
Alielson Piffer

3
对我来说,这是“诺顿安全网”。
法兰克福-laravel

51

如果您是扩展程序开发人员,并且在这里搜索了自己的方法以尝试停止导致此错误:

问题不是CORB,因为被阻止的COR 表现为警告,例如-

跨域读取阻止(CORB)阻止了MIME类型为text / html的跨域响应 https://www.example.com/example.html。有关更多详细信息,请参见 https://www.chromestatus.com/feature/5629709824032768

问题很可能是对runtime.sendMessage的异步响应处理不当。正如MDN所说

要发送异步响应,有两个选项:

  • 从事件侦听器返回true。这使sendResponse函数在侦听器返回之后保持有效,因此您可以稍后对其进行调用。
  • 从事件侦听器返回一个Promise,并在收到响应时解决(或在发生错误时拒绝它)。

当您发送异步响应但无法使用这两种机制中的任何一种时,提供的sendResponse参数sendMessage将超出范围,结果与错误消息所述的完全相同:在响应被关闭之前,您的消息端口(消息传递设备)已关闭收到。

Webextension-polyfill的作者已经在2018年6月撰写了有关它的文章

因此,最重要的是,如果您看到扩展引起这些错误,请仔细检查所有onMessage侦听器。其中一些可能需要开始返回promise (将它们标记为异步应该足够了)。[感谢@vdegenne]


4
请注意,请勿将其async/await用于后台侦听器回调。这对我来说是失败的,我删除了结构并将其async转换awaitthen结构代码,现在它可以工作了。
vdegenne

但是...我不是要发送任何答复,也不希望收到任何答复!
迈克尔·

太好了,谢谢!我要做的就是添加return true;chrome.runtime.onMessage.addListener()函数的底部,问题就解决了!我$.ajax在此函数内部使用jQuery ,这就是为什么我需要此修复程序的原因。
RcoderNY

42

如果您访问chrome:// extensions /,则可以一次切换每个扩展名,然后查看实际上是哪个触发了该问题。

关闭扩展名后,刷新看到错误的页面,然后左右摆动鼠标或单击。鼠标动作是引发错误的事情。

因此,我能够查明实际上是哪个扩展引起了问题,并将其禁用。


2
在我的情况下,这是1密码扩展名
Alexander Kim

在我的情况下,它是色彩对比度分析器
Michael Liquori

2
以我为例,这是Google Publisher Toolbar在维瓦尔第(Vivaldi)vivaldi://extensions
沉圣

是的,一一禁用扩展。我发现有多个扩展导致错误!感谢
Jose Mhlanga

17

Post很旧,与Chrome扩展程序的开发并没有密切的关系,但可以在这里发布。

在回调中响应消息时,我遇到了同样的问题。解决方案是在后台消息侦听器中返回true

这是background.js的简单示例。它响应来自popup.js的任何消息。

chrome.runtime.onMessage.addListener(function(rq, sender, sendResponse) {
    // setTimeout to simulate any callback (even from storage.sync)
    setTimeout(function() {
        sendResponse({status: true});
    }, 1);
    // return true;  // uncomment this line to fix error
});

这是popup.js,它在弹出窗口上发送消息。在取消注释background.js文件中的“ return true”行之前,您将获得例外。

document.addEventListener("DOMContentLoaded", () => {
    chrome.extension.sendMessage({action: "ping"}, function(resp) {
        console.log(JSON.stringify(resp));
    });
});

manifest.json,以防万一:)注意警报权限部分!

{
  "name": "TestMessages",
  "version": "0.1.0",
  "manifest_version": 2,
  "browser_action": {
    "default_popup": "src/popup.html"
  },
  "background": {
    "scripts": ["src/background.js"],
    "persistent": false
  },
  "permissions": [
    "alarms"
  ]
}

它为我工作!默认情况下哪种情况return false有用?
Eduardo Reis

Docs说This function becomes invalid when the event listener returns, unless you return true。什么意思无效?它不是应该每次收到消息时都创建吗?
Eduardo Reis

@EduardoReis,如果设置为FALSE,它可以用作通知事件的通知者。
Aleksej Vasinov

14

我已经回答了这个

就我而言,问题是由于Video Downloader professionalAdBlock

简而言之,由于某些Google chrome插件而出现此问题


7

如果错误的原因是扩展用隐身 Ctrl+ Shift+ N。在隐身模式下,Chrome没有扩展程序。

UPD。如果您需要在隐身模式下进行某些扩展,例如ReduxDevTools或其他任何扩展,请在扩展设置中启用“允许隐身”


4

对于那些来这里调试Chrome 73中的错误的人来说,一种可能是因为Chrome 73以后开始禁止内容脚本中的跨域请求。

更多阅读:

  1. https://www.chromestatus.com/feature/5629709824032768
  2. https://www.chromium.org/Home/chromium-security/extension-content-script-fetches

这影响到许多Chrome扩展作者,他们现在需要争夺修复扩展,因为Chrome认为“我们的数据表明,大多数扩展不会受到此更改的影响。”

(与您的应用程序代码无关)

更新:我修复了CORs问题,但仍然看到此错误。我怀疑这是Chrome的错。




2

确保使用正确的语法。

我们应该在侦听它之后使用sendMessage()方法。

下面是一个简单的例子contentScript.js它sendRequest将到app.js

contentScript.js

chrome.extension.sendRequest({
    title: 'giveSomeTitle', params: paramsToSend
  }, function(result) { 
    // Do Some action
});

app.js

chrome.extension.onRequest.addListener( function(message, sender, 
 sendResponse) {
  if(message.title === 'giveSomeTitle'){
    // Do some action with message.params
    sendResponse(true);
  }
});

1

如果浏览器上安装了任何防病毒扩展,请禁用。就我而言,反病毒扩展才是罪魁祸首。



0

就我而言,这是我自己的页面源中设置的断点。如果我删除或禁用了断点,则错误将清除。

断点位于渲染代码的一个相当复杂的块中。页面不同部分中的其他断点没有这种效果。我无法制定出一个总是会触发此错误的简单测试用例。


0

我将控制台日志数据从一个选项卡发送到另一个选项卡,但实际上并不需要第一个控制台。但是,错误消息确实使我烦恼,所以我右键单击并选择“不显示来自x网站的消息”。也许这是最简单的解决方法:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.