Ошибка порта: не удалось установить соединение.Получающий конец не существует.В хромиуме - PullRequest
50 голосов
/ 02 февраля 2012

Я разрабатываю расширение в Chrome, и есть проблема.В моем inject.js я делаю запрос как:

chrome.extension.sendRequest({command:'skip'},callback)

, а в моем `background.js я просто добавляю прослушиватель запроса как:

chrome.extension.onrequest.addListener(function(req,sender,res){console.log("procession"})

Но есть ошибка:

Ошибка порта: не удалось установить соединение.Конец получения не существует

Кажется, ошибка в Chrome?PS:
часть моего manifest.json

"background": {
    "scripts": ["background.js"]
  },
  "content_scripts": [
    {
      "matches": ["&lt all_urls &gt"], 
      "js": ["inject.js"]
    }
  ],

Я нахожусь в Chromium 17, и я попытался перезагрузить расширение, снова открыв браузер ... ничего не произошло
кто-то получил некоторые идеи

Ответы [ 14 ]

22 голосов
/ 27 июля 2012

Это не всегда причина, но если у вас есть ошибка в вашем background.js, вы должны проверить эту ссылку:

Inspect views: _generated_background_page.html

на странице Расширения, которая покажет вам любые ошибки JavaScript.

Это мешало установлению моих соединений.

14 голосов
/ 21 июля 2012

Возможно, проблема в том, что sendRequest() и onRequest устарели и заменены на sendMessage() и onMessage. После недавнего обновления Chrome 20 они полностью исчезли.

Официальная документация по Передача сообщений даже не упоминает sendRequest().

Вот ссылка, которая немного документирует изменение: http://codereview.chromium.org/9965005/

9 голосов
/ 06 февраля 2012

У меня возникла такая же проблема, как вы описали здесь. Решение, которое я нашел и которое работает для меня, заключается в использовании фоновой страницы вместо фонового скрипта, например:

"background_page": "src/background.html",
  // maybe this seems to work instead of background { scripts [] }

  /* this gives a Port error: Could not ...
  "background": {
  "scripts": ["src/background.js"]
  },
  */

Я надеюсь, что это работает и для вас.

5 голосов
/ 19 июля 2012

Фоновая страница HTML у меня не работала в Chrome 20.0.1132.57 m в Windows 7 с той же ошибкой:

Port error: Could not establish connection. Receiving end does not exist. miscellaneous_bindings:232

Я пытался использовать скрипт background.js со следующим содержимым:

chrome.extension.onConnect.addListener(function(port) {
    port.onMessage.addListener(function(msg) {
        // May be empty.
    });
});

Это решило немедленное onDisconnect в моем скрипте контента:

port = chrome.extension.connect();
port.onDisconnect.addListener(function (event) {
    // Happened immediately before adding the proper backend setup.
    // With proper backend setup, allows to determine the extension being disabled or unloaded.
});

Правильный код взят из примера обмена сообщениями Chromium Extensions: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/messaging/timer/page.js?view=markup

Пример также содержит вторую часть, которая служит бэкэндом для sendRequest, но я сам не проверял:

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {
        // Don't know if it may be empty or a sendResponse call is required.
    });
2 голосов
/ 24 января 2016

Сейчас сталкиваемся с той же проблемой.

// Вот мой бывший background.js :

chrome.runtime.onInstalled.addListener(function () {
  //some other code here
  chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
    if (message.url) {
        chrome.downloads.download({
            url: message.url,
            conflictAction: 'uniquify',
            saveAs: false
        });
    }
});});//(Sorry, I tried but failed to put the last bracket on next line)

Видите ли, chrome.runtime.onMessage.addListener запускается, когда событие onInstalled happpens и когда я выхожу из этой области видимости, и мой код выглядит так:

chrome.runtime.onInstalled.addListener(function () {
  //some other code here
});  
chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
    if (message.url) {
        chrome.downloads.download({
            url: message.url,
            conflictAction: 'uniquify',
            saveAs: false
        });
    }
});

Теперь это работает хорошо. Надеюсь быть полезным.

2 голосов
/ 20 июня 2013

Я также использую sendMessage и onMessage для связи, и в своем рабочем процессе я сначала отправляю сообщение из инжектированного.js в мой background.js и также получаю "Порт" ошибка: не удалось установить соединение. Получающий конец не существует. " ошибка.

Поэтому я решил разобраться с использованием функциональных возможностей ответов (например, ACK ), и, если фон не отвечает, я продолжаю пытаться использовать setTimeout, например, так.

// background.js

...
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
...
//some code

sendResponse({status: 'everything ok'})
return true;    
});

// injected.js

var myInjectedFunctionality = function() {

    chrome.extension.sendMessage({method: "Steroids:loadScripts"}, function(res) {
        if(res && res.status) {
            } else {
                setTimeout(myInjectedFunctionality, 3000);
            }
    });
};
myInjectedFunctionality();

Мой код теперь работает правильно, поэтому я думаю, что объяснение легко просмотреть. Chrome не подготавливает Background.js и соединения, когда он внедряет ваш код на страницы, где вы хотите, и поэтому никто не слушает отправленное вами сообщение, поэтому, если никто не слушает, продолжайте пытаться, как я.

2 голосов
/ 17 ноября 2012

Через некоторое время, потраченное на расследование, я обнаружил проблему в моем деле.

Я также получаю:

Port error: Could not establish connection. Receiving end does not exist. 

Прежде чем объяснить, я хочу сказать, что я использую sendMessage и onMessage для связи.

Для меня эта ошибка появляется, когда я отправляю сообщение с фоновой страницы на одну вкладку, где выполняется мой скрипт содержимого.

Мое расширение работает только на вкладках, где открыт YouTube. Поэтому, когда я изменяю некоторые настройки, я смотрю, какие вкладки у меня открыты, и отправляю сообщение для обновления обновленных настроек.

В нормальном случае это работает нормально, но если у меня n (n> = 1) вкладок с открытой YouTube. Я нажимаю кнопку «Обновить» для расширения, я что-то изменяю ... вкладки YouTube не обновляются, и они теряют прослушиватель сообщений, поэтому я получаю эту ошибку.

Кажется, это нормально.

Если я обновлю вкладки YouTube после перезагрузки расширения, я не получу эту ошибку.

Я нашел одно решение, оно может применяться не во всех случаях:

Когда у меня возникла эта проблема, мой код был:

chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue}, function(response) {});

Теперь мой код:

chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue});

Для меня мне не требовался ответный обратный вызов, и, поскольку он не отвечал, у меня была эта ошибка.

1 голос
/ 28 января 2016

Я видел эту ошибку, используя manifest_version: 2 и chrome.runtime.sendMessage.Я подключаюсь с веб-страницы к расширению, а не внутри расширения.

Решением было убедиться, что у меня есть правильные значения в массиве externally_connectable.matches в manifest.json.Вам нужно перечислить URL-адреса, которые вы хотите подключить к расширению.Смотри https://developer.chrome.com/extensions/manifest/externally_connectable#without-externally-connectable.

1 голос
/ 01 июля 2013

Проверьте последние руководства: http://developer.chrome.com/extensions/messaging.html

Примечание. Если несколько страниц прослушивают события onMessage, только первый вызов sendResponse () для определенного события будет успешным в отправив ответ. Все остальные ответы на это событие будут игнорироваться.

Закройте свои вкладки, оставьте только одну страницу и проверьте. В моем случае это была проблема.

1 голос
/ 11 августа 2012

попробуйте добавить некоторые контекстные скрипты во вкладку с URL-адресом chrome: // * или https://chrome.google.com/*, при подключении этих вкладок на фоновой странице

например

chrome.tabs.connect(tab.id).postMessage(msg)

тогда скинет

Port error: Could not establish connection. Receiving end does not exist.

эти страницы не позволяют вводить скрипты содержимого, и соединение будет немедленно разорвано.

итак, проверьте URL и не подключайте эти вкладки, тогда исключение не выдается

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