Подтвердить что ты не робот

Ошибка порта: не удалось установить соединение. Конец приема не существует. В хромовой

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

"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"]
  },
  */

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

Ответ 2

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

Inspect views: _generated_background_page.html

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

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

Ответ 3

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

В официальной документации Message Passing больше не упоминается sendRequest().

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

Ответ 4

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

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

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

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

Это решило немедленный onDisconnect в моем контенте script:

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.
    });

Ответ 5

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

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

Ответ 6

попробуйте ввести некоторые скрипты contect в вкладку, где url chrome://* или https://chrome.google.com/*, когда вы подключаете эти вкладки в backgroundpage,

например

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

затем бросит

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

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

Итак, проверьте URL-адрес и не подключайте эти вкладки, затем исключение не выбрано

Ответ 7

После некоторого времени, потраченного на исследование, я нашел проблему в моем случае.

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

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

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

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

My extension работает только на вкладках, где открыт 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});

Для моего ответа мне не нужен ответ, и потому что он не отвечал, у меня была эта ошибка.

Ответ 8

Я использую sendMessage и onMessage для связи, и в своем рабочем процессе я сначала отправляю сообщение от injected.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 и соединения, когда он вводит ваш код на страницах, где вы хотите, и поэтому никто не прослушивает ваше отправленное сообщение, поэтому, если никто не слушает, просто продолжайте попытки, как я.

Ответ 9

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

//Вот мой прежний 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
        });
    }
});

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

Ответ 10

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

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

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

Ответ 11

Некоторые другие ответы здесь содержат полезные советы по отладке или небольшие кусочки головоломки, однако, если вы хотите, чтобы вставлял в (сторонние) веб-страницы, как я, то здесь нет ответов, перечисляющих правильные компоненты.

Есть 4 шага:

  • внешний фоновый слушатель,
  • отправитель сообщения переднего плана,
  • вставка идентификатора расширения для отправителя сообщения
  • и правило в манифесте, чтобы связать все вместе.

В приведенном ниже примере должно быть все, что вам нужно, чтобы позволить вам внедрить js, который отправляет сообщения с любой страницы на google.com на ваше собственное расширение

Сначала в manifest.json необходимо добавить правила обмена сообщениями, которые описаны здесь:

"externally_connectable": {
    "matches": ["*://*.google.com/*"]
}

Затем в фоновом скрипте или на странице вам нужен внешний слушатель (не обычный chrome.runtime.onMessage.addListener, о котором упоминалось в msot ответы), это описано здесь:

chrome.runtime.onMessageExternal.addListener( (request, sender, sendResponse) => {
    console.log("Received message from " + sender + ": ", request);
    sendResponse({ received: true }); //respond however you like
});

Когда у вас есть эти части, вы можете использовать отправителя сообщения, как обычно, но с идентификатором расширения в качестве первого параметра:

chrome.runtime.sendMessage(myExtId, { /* whatever you want to send goes here */ },
    response => {
         /* handle the response from background here */
    }
);

Если вы не знаете, как получить внешний идентификатор, который я использовал в качестве первого параметра, вы можете вставить свой идентификатор расширения, как показано ниже. Это необходимо, потому что chrome.runtime.id и @@extension_id оба не работают во внедренных сценариях:

//create a script tag to inject, then set a variable with the id in that script
let idScript = document.createElement("script");
idScript.setAttribute("type", "application/javascript");
idScript.textContent = 'var myExtId = "' + chrome.runtime.id +'";';
let parent = ( document.head || document.documentElement );
parent.insertBefore( idScript, parent.firstChild );

//inject and run your other script here

idScript.remove(); //then cleanup 

Поскольку мы установили его как var, другой скрипт теперь может напрямую обращаться к значению

Ответ 12

Если у вас возникла проблема, в основном потому, что вы ссылаетесь на устаревший документ, обновите его!

Посетите: chrome extension: messaging.html

Ответ 13

Я видел эту проблему, когда мой контент script не загружался, поэтому отправка сообщения никогда не происходила.

Проблема заключалась в том, что у меня был инспектор фона script open и просто нажимал Cmd + R (обновление), но в моем manifest.json была ошибка. Когда я действительно пошел на страницу расширений и перезагрузил эту страницу, я получил предупреждение, показывающее ошибку манифеста.

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

Ответ 14

Для манифеста 2.0 и случая sendMessage это довольно просто:

Это происходит, если вы пытаетесь использовать sendMessage во всплывающем окне, и нет конца настройки слушателя в конце фонового скрипта, или слушатель каким-то образом удален.

Под слушателем я имею в виду - chrome.runtime.onMessage.addListener.

Ответ 15

Я помещаю chrome.runtime.sendMessage и chrome.runtime.onMessage.addEventListener в скрипте контента в window.onload или в функцию самореализации, и она работает. И в манифесте я использую

"background": { "scripts": ["background.js"], "persistent": false },

manifest_version: 2. Надеюсь, это поможет.