Chrome 扩展错误“未检查的 runtime.lastError:消息端口在收到响应之前关闭”

Posted

技术标签:

【中文标题】Chrome 扩展错误“未检查的 runtime.lastError:消息端口在收到响应之前关闭”【英文标题】:Chrome extension error "Unchecked runtime.lastError: The message port closed before a response was received" 【发布时间】:2020-05-11 19:31:11 【问题描述】:

我试图简单地从 popup.js 调用 background.js 中的一个函数。但是,我得到“未检查的 runtime.lastError:消息端口在收到响应之前关闭。”错误。

我最初的“握手”消息运行良好,没有错误,但我的“AnotherMessage”收到上述错误。

我正在尝试遵循here 找到的 onMessage 和 sendMessage 文档,但我可能做错了什么。

popup.js

//works perfectly fine
chrome.runtime.sendMessage(msg:"Handshake", response => 
    if(response.error)
        console.log(response);
    
);

//Gives error message
chrome.runtime.sendMessage(msg:"AnotherMessage", response => 
    if(response.error)
        console.log(response);
    
);

我想要两个 'sendMessage' 的原因是因为我想根据某些逻辑在 background.js 中执行特定的功能。

background.js

chrome.runtime.onMessage.addListener((request,sender,sendResponse)
if(request.msg === "Handshake")
    //Do something
 else if (request.msg === "AnotherMessage") 
    //Do something else
   
);

更新:为了添加一些上下文,我的扩展中基本上有两种形式。我想将表单提交的数据发送到我的数据库,所以“form-1”提交执行“function-1”和“form-2 em>' 提交应该在 background.js 中执行 'function-2'。我正在尝试通过 sendMessage 和 onMessage 实现不同的功能执行。

【问题讨论】:

在后台脚本中,如果异步调用sendResponse,则必须从回调函数中返回true 尝试将第二个 sendMessage 放在第一个的回调中。 请把我当白痴对待。我不确定您的意思,您介意详细说明吗? 【参考方案1】:

在后台脚本中,如果异步调用sendResponse,则必须从回调函数中返回true

 chrome.runtime.onMessage.addListener((request,sender,sendResponse)
    if (request.msg === "Handshake")
        //Do something
     else if (request.msg === "AnotherMessage") 
        //Do something else
   
   return true;   
);

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。

以上是关于Chrome 扩展错误“未检查的 runtime.lastError:消息端口在收到响应之前关闭”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Chrome 33+ 中通过 GPO 自动安装 Chrome 扩展(Chrome 错误或 GPO 安装的扩展的未记录更改?)

Chrome 扩展错误:Require 未定义

chrome 扩展中的“拒绝加载脚本”错误

Chrome 扩展 ajax 发送格式错误的重音字符

Redux 开发工具 Chrome 扩展 Immutable.js 导致错误

未捕获的类型错误:无法读取 chrome 扩展中未定义的属性“本地”