Chrome扩展程序消息未发送响应(未定义)

时间:2018-01-05 05:35:07

标签: javascript google-chrome google-chrome-extension

供将来参考:我通过将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中编写所有内容吗?

谢谢!

3 个答案:

答案 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 chromedocs for firefox)。