供将来参考:我通过将onMessage / sendMessage分别切换到后台脚本和内容脚本来解决这个问题。我不确定为什么会这样,但确实如此。
我过去三个小时一直试图调试这个问题 - 我正在构建一个chrome扩展程序,而且我已经得到了#undefined"作为对我发送的消息的回复。我试图获取用户所在标签的文本并使用它进行分析。
内容脚本:
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.method == "collectText") {
sendResponse({data: document.body.innerText, method: "collectText"});
}
return true;
}
);
弹出脚本:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {method: "collectText"}, function(response) {
if (response) {
txt = response.data;
console.log("response arrived");
console.log(txt);
} else {
console.log("No response.");
}
});
});
console.logs目前在那里,以便我知道数据是否会返回(它不是 - "每次脚本运行时都会记录没有响应" {{1结束未定义)。我不确定为什么这不起作用(我在相同的脚本上尝试了很多变化无济于事)。我在扩展程序或我所在页面的控制台中没有收到任何错误。我应该使用后台脚本而不是在popup.js中编写所有内容吗?
谢谢!
答案 0 :(得分:0)
由于代码+ comment:
,您可能会收到错误// According to the documentation of chrome.runtime.sendMessage, the
// callback is invoked without any arguments when an error occurs
您需要查看lastError
获取有关错误的信息并修复它的属性。
答案 1 :(得分:0)
供以后参考:我通过分别将onMessage / sendMessage切换为后台脚本和内容脚本来解决此问题。我不确定为什么这样做,但确实如此。
答案 2 :(得分:0)
如果您异步返回答案,则会发生此类错误。 (尽管在您给出的示例中不会发生这种情况)
// sender
runtime.sendMessage(msg, response => {
if (!response)
console.error("This was a fiasco :", runtime.lastError.message);
});
// receiver
runtime.onMessage.addListener(async (request, sender, sendResponse) => {
var response = await answer_something(request);
sendResponse(response);
});
// same problem for this receiver
runtime.onMessage.addListener((request, sender, sendResponse) => {
promise_something(request).then(response => {
sendResponse(response);
});
});
在这种情况下,您会看到以下错误:Unchecked runtime.lastError: The message port closed before a response was received
要修复此问题,必须从异步true
侦听器返回onMessage
。请注意,返回承诺不适用于Chrome(docs for chrome,docs for firefox)。