Расширение Chrome Не проверено runtime.lastError: Не удалось установить соединение. Получающий конец не существует - PullRequest
1 голос
/ 17 октября 2019

Я знаю, что есть похожие вопросы, но мне еще не удалось найти вопрос, который решает мою проблему.

В основном я пытаюсь отправить сообщение из моего скрипта background.js в мой скрипт content.js следующим образом

background.js

chrome.runtime.onInstalled.addListener(() => {

  // Listen for when a user is on correct site and enable the extension
  chrome.webNavigation.onCompleted.addListener(() => {
    chrome.tabs.query({ active: true, currentWindow: true }, ([{ id }]) => {
      chrome.pageAction.show(id);
    });
  }, { url: [{ urlMatches: 'website.com' }] });

  chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
    checkUrl(tab);
  });

  chrome.tabs.onActivated.addListener(() => {
    checkUrl();
  });

  chrome.tabs.onCreated.addListener((tab) => {
    checkUrl(tab);
  });
});

// Check to see if current url is either website or website1
const checkUrl = (tab = null) => {
  if (!tab) {
    chrome.tabs.query({ active: true, lastFocusedWindow: true }, (tabs) => {
      tab = tabs[0];
      if (tab.url.includes('website')) {
        getInfo(tab);
      } else if (tab.url.includes('website2')) {
        getOtherInfo();
      }
    });
  } else if (tab) {
    if (tab.url.includes('website')) {
      getInfo(tab);
    } else if (tab.url.includes('website2')) {
      getOtherInfo();
    }
  }
}

const getInfo = (tab) => {
  chrome.tabs.sendMessage(tab.id, { text: 'report_back' }, (result) => {
    console.log('report_back', result);
  });
}

const getOtherInfo = () => {

}

content.js

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  console.log(msg);
  if (msg.text === 'report_back') {
    setTimeout(() => {
      sendResponse(document);
    }, 10000);
  }
});

, но каждый раз, когда я перехожу на нужные страницыЯ получаю следующие ошибки в консоли background.js

Unchecked runtime.lastError: Не удалось установить соединение. Получающий конец не существует.

и мой console.log - tabs undefined

Я не уверен, что я делаю неправильно?

РЕДАКТИРОВАТЬ

Сейчас я делаю это точно так же, как указано в официальных документах обмена сообщениями

background.js

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
  chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
    console.log(response.farewell);
  });
});

content.js

chrome.runtime.onMessage.addListener(
  function (request, sender, sendResponse) {
    console.log(sender.tab ?
      "from a content script:" + sender.tab.url :
      "from the extension");
    if (request.greeting == "hello") {
      sendResponse({ farewell: "goodbye" });
    }
    return true;
  });

и он не работает .. что я делаю не так?

Я даже пытался обернуть sendResponseв setTimeout(), но без изменений

if (request.greeting == "hello") {
      setTimeout(() => {
        sendResponse({ farewell: "goodbye" });
      }, 10000);
      return true;
    }

РЕДАКТИРОВАТЬ 2

Я попытался повторно запустить функцию, если есть ошибка

chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
    chrome.tabs.sendMessage(tabs[0].id, { greeting: "hello" }, function (response) {
      if (chrome.runtime.lastError) {
        console.log('error');
        setTimeout(getInfo, 1000);
      } else {
        console.log(response.farewell);
      }
    });
  });

и я получаю ошибку несколько раз

enter image description here

любая помощь будет оценена !! Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...