“侦听器通过返回 true 指示异步响应,但消息通道在收到响应之前关闭”,这是什么意思?

Rom*_*gil 193 javascript npm reactjs

我正在开发一个 React 应用程序,并且使用了一些 npm 模块,其中一个模块是我必须自己构建的。(我的 NPM 包:\n https://www.npmjs.com/package/modale-react-rm)。

\n

这是一个简单的模式,用 来打开和关闭useState()

\n

导入包后,我的控制台中出现错误,几秒钟后突然出现错误,而没有执行任何操作。

\n
\nUncaught (in promise)                                                                  localhost/:1\n\n    >{message: \'A listener indicated an asynchronous response by r\xe2\x80\xa6age channel closed before a response was received\'}\n         message: "A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received"\n        >[[Prototype]]: Object\n             >constructor: \xc6\x92 ()\n             >[[Prototype]]: Object\n\n       /* sometimes there are specific elements in addition but I could not check when they appear and when not */\n\n            Promise.then (asynchrone)       \n            (anonyme)              @content_script_bundle.js:108\n            handleNewFeatures      @content_script_bundle.js:101\n            handleUpdatedNodes     @content_script_bundle.js:101\n            (anonyme)              @content_script_bundle.js:101\n            childlist(asynchrone)\n            0                      @purplebox.js:1\n            (anonyme)              @purplebox.js:1\n            v                      @purplebox.js:1\n\n
Run Code Online (Sandbox Code Playgroud)\n

控制台图像错误

\n

它不会阻止我的页面,也不会阻止其功能的正常运行,但这是一个错误,我认为它应该被修复,也许可以帮助其他有同样问题的人。

\n

我指定我不在该项目中发出任何异步请求。一切都是本地的,我使用的少数数据是直接以原始格式导入的。\n我也不知道Purplebox.js来自哪里。

\n

Chr*_*ejn 230

此问题是跨域请求问题,由各种 Chrome 扩展程序引起。我的 Angular 应用程序中也有这个问题,在隐身模式下测试后,错误不再出现。

更多信息:谷歌论坛

/编辑:如果您是来到这里的扩展开发人员:您需要将跨源获取请求从内容脚本移动到扩展的后台页面,并从内容脚本调用它。不再允许在内容脚本中进行跨源提取。不要忘记return true请求末尾的 。更多信息和示例:Chromium 项目

  • 这很难说,我不知道你使用的是哪些扩展。示例:对我来说,它是 Ghostery,它们会产生许多控制台错误。即使在他们自己的网站上,我也会收到这些错误。 (13认同)
  • 对我来说也是一个延伸。我一直在查看我的应用程序,试图找出我搞砸的地方,它是一个扩展(Ghostery)。 (5认同)
  • 自 Google Chrome 更新 102 或 103 以来,错误开始出现。 (2认同)

Min*_*ina 73

就我而言,这是由Ghostery 扩展引起的,如果此错误出现在您的本地主机中,您需要将其添加到 Ghostery 的受信任站点列表中,错误就会消失。

在此输入图像描述

  • 单击“信任站点”对我不起作用,我必须进入三点菜单“信任和限制”,并将“127.0.0.1:*”添加到信任列表中。之后,错误就消失了!谢谢 (5认同)

小智 14

后台脚本(MV3 中的服务工作线程)可能会进入非活动状态,而不向从内容脚本收到的消息发送响应。

例子:

后台脚本:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  // ... handle message
  return true // Error message says you already return true
})
Run Code Online (Sandbox Code Playgroud)

大多数 MV3 API 都是异步的,并且可以在有意义时返回 Promise。(在某些情况下,例如事件侦听器(例如:chrome.tabs.onRemoved),返回承诺没有意义)。然而,可以使用回调或承诺风格来读回响应。

内容脚本:读取响应的方法1:

chrome.runtime.sendMessage('ping', (response) => { /* read response */ })
Run Code Online (Sandbox Code Playgroud)

内容脚本:读取响应的方法2:

chrome.runtime.sendMessage('ping').then(response => { /* read response */ })
Run Code Online (Sandbox Code Playgroud)

您面临的问题是:后台脚本不会调用sendResponse()它收到的一条或多条消息并变为非活动状态(导致消息通道关闭)。但是,发送消息的内容脚本正在等待响应。

请检查您的消息发送者和处理程序。


Phi*_*ßen 10

它已webextension-polyfill中进行了讨论,许多扩展(包括 Ghostery)都使用该库。Chrome 最近进行了一项更改,引入了错误消息。

对于使用 polyfill 的项目,我希望如果合并修复,警告就会消失。请注意,使用了polyfill库,因为只有Firefox实现了新的基于promise的runtime.onMessage,而Chrome仍然强制执行原始的回调式API

请注意, webextension-polyfill 库中已经有一个开放的拉取请求。它没有被合并,但根据我的测试,它解决了问题。因此,如果您需要快速修复内部使用该库的项目,您可以使用patch-package手动应用补丁。例如,这就是 Ghostery 中此类更改的样子


小智 6

我有同样的错误。我删除了Tampermonkey扩展并调整了我的AdBlock扩展,然后它对我有用了。