Как исправить проблему Chrome «Unchecked runtime.lastError: порт сообщения закрыт до получения ответа»?

139

Я использую VueJS и Laravel для своего проекта. Эта проблема начала проявляться в последнее время и проявляется даже в старых ветках git.

Эта ошибка отображается только в браузере Chrome.

Триумф Македончи
источник
3
У вас есть блокировщик рекламы?
Maelig
1
Проверьте мой ответ на этот другой запрос: stackoverflow.com/questions/53919591/…
Dolfiz
3
Спасибо, ребята, проблема была в расширении Video Downloader professional.
Triumf Maqedonci
2
То же самое для меня, Video Downloader professional
выдавал
1
Голосование за закрытие, поскольку принятое решение является проблемой конфигурации и не связано с устранением / пониманием причины проблемы с программированием.
Грег Домьян

Ответы:

165

Я отключил все установленные расширения в Chrome - у меня работает. У меня теперь чистая консоль без ошибок.

MirekH
источник
20
MeddleMonkey disabled
terantul
7
У меня была эта проблема, вызванная расширением Norton Safe Search Extension
Boardy
7
В моем случае расширение было Google Publisher Toolbar
Леандро Кастро
3
Для меня это был «Norton Safe Web».
frankfurt-laravel
2
Как отключить все расширения - решение ... или даже соображение. Для многих из нас расширения обеспечивают важную функциональность.
Винс
53

Если вы разработчик расширения, который искал в Google свой путь, пытаясь остановить эту ошибку:

Проблема не в CORB, так как заблокированные COR проявляются в виде предупреждений вроде -

Блокировка чтения из разных источников (CORB) заблокировала ответ из разных источников https://www.example.com/example.html с типом MIME text / html. См. Https://www.chromestatus.com/feature/5629709824032768 для получения дополнительных сведений.

Скорее всего, проблема заключается в неправильно обработанном асинхронном ответе на runtime.sendMessage. Как говорит MDN :

Чтобы отправить асинхронный ответ, есть два варианта:

  • вернуть истину из прослушивателя событий. Это сохраняет функцию sendResponse действующей после возвращения слушателя, поэтому вы можете вызвать ее позже.
  • вернуть Promise из прослушивателя событий и разрешить, когда у вас есть ответ (или отклонить его в случае ошибки).

Когда вы отправляете асинхронный ответ, но не можете использовать ни один из этих механизмов, предоставленный sendResponseаргумент для sendMessageвыходит за пределы области видимости, и результат в точности соответствует сообщению об ошибке: порт вашего сообщения (устройство передачи сообщений) закрывается до того, как ответ был получили.

Авторы Webextension-polyfill уже писали об этом в июне 2018 года .

Итак, суть в том, что если вы видите, что ваше расширение вызывает эти ошибки - внимательно проверьте всех своих слушателей onMessage. Некоторым из них, вероятно, нужно начать возвращать обещания (достаточно пометить их как асинхронные). [Спасибо @vdegenne]

Офек Шилон
источник
4
В качестве хедз-ап не используйте async/awaitдля обратного вызова фонового слушателя. Это то, что мне не удалось, я удалил asyncи преобразовал свою awaitструктуру в thenкод структуры, и теперь она работает.
vdegenne 02
но ... я не пытаюсь отправить ответ и не жду его!
Майкл
Какое отличное исправление, спасибо! Все, что мне нужно было сделать, это добавить return true;в конец функции chrome.runtime.onMessage.addListener (), и проблема была решена! Я использую jQuery $.ajaxвнутри этой функции, поэтому мне нужно это исправление.
RcoderNY
42

Если вы перейдете к chrome: // extensions / , вы можете просто переключать каждое расширение по одному и посмотреть, какое из них действительно вызывает проблему.

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

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

Aguayma
источник
2
В моем случае это было расширение на 1 пароль
Александр Ким
в моем случае это был анализатор цветового контраста
Майкл Ликтори
2
В моем случае это было Google Publisher Toolbarпри Вивальдиvivaldi://extensions
Шим-Сао
Да, отключать расширения одно за другим. Я выяснил, что ошибку вызывают несколько расширений! Спасибо
Хосе Мланга
17

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

У меня была такая же проблема при ответе на сообщение в обратном вызове. Решение состоит в том, чтобы вернуть истину в прослушивателе фоновых сообщений.

Вот простой пример background.js . Он отвечает на любое сообщение от popup.js.

chrome.runtime.onMessage.addListener(function(rq, sender, sendResponse) {
    // setTimeout to simulate any callback (even from storage.sync)
    setTimeout(function() {
        sendResponse({status: true});
    }, 1);
    // return true;  // uncomment this line to fix error
});

Вот popup.js , который отправляет сообщение во всплывающем окне . Вы будете получать исключения, пока не отмените комментарий строки «return true» в файле background.js .

document.addEventListener("DOMContentLoaded", () => {
    chrome.extension.sendMessage({action: "ping"}, function(resp) {
        console.log(JSON.stringify(resp));
    });
});

manifest.json , на всякий случай :) Обратите внимание на раздел разрешений тревог!

{
  "name": "TestMessages",
  "version": "0.1.0",
  "manifest_version": 2,
  "browser_action": {
    "default_popup": "src/popup.html"
  },
  "background": {
    "scripts": ["src/background.js"],
    "persistent": false
  },
  "permissions": [
    "alarms"
  ]
}
Алексей Васинов
источник
У меня это сработало! Какой сценарий по умолчанию return falseбыл бы полезен?
Эдуардо Рейс,
Docs говорит : This function becomes invalid when the event listener returns, unless you return true. Что значит инвалид? Разве он не должен создаваться каждый раз, когда получает сообщение?
Эдуардо Рейс
@EduardoReis, со значением FALSE может использоваться как информер для уведомления о каком-либо событии.
Алексей Васинов
14

Я ответил на это .

В моем случае проблема была из-за Video Downloader professionalиAdBlock

Короче говоря, эта проблема возникает из-за некоторых плагинов Google Chrome.

nokieng
источник
6

Если причиной ошибки является расширение, используйте инкогнито Ctrl+ Shift+ N. В режиме инкогнито Chrome не имеет расширений.

UPD. Если вам нужно какое-то расширение в режиме инкогнито, например ReduxDevTools или любое другое, в настройках расширения включите «Разрешить в режиме инкогнито»

Airush
источник
4

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

Больше чтения:

  1. https://www.chromestatus.com/feature/5629709824032768
  2. https://www.chromium.org/Home/chromium-security/extension-content-script-fetches

Это влияет на многих авторов расширений Chrome, которым теперь нужно изо всех сил стараться исправить расширения, потому что Chrome думает: «Наши данные показывают, что это изменение не коснется большинства расширений».

(это не имеет ничего общего с кодом вашего приложения)

ОБНОВЛЕНИЕ : я исправил проблему с COR, но все еще вижу эту ошибку. Я подозреваю, что здесь виноват Chrome.

Джонатан Лин
источник
4

Эта ошибка обычно вызвана одним из ваших расширений Chrome.

Я рекомендую установить этот One-Click Extension Disabler , я использую его с сочетанием клавиш COMMAND (⌘)+ SHIFT (⇧)+ D-, чтобы быстро отключить / включить все мои расширения.

После отключения расширений это сообщение об ошибке должно исчезнуть.

Мир! ✌️

Ахмад Авайс
источник
2

В моем случае это было расширение Chrome для OneTab.

Сулеман
источник
2

Убедитесь, что вы используете правильный синтаксис.

Мы должны использовать метод sendMessage () после его прослушивания.

Вот простой пример contentScript.js It SendRequest к app.js .

contentScript.js

chrome.extension.sendRequest({
    title: 'giveSomeTitle', params: paramsToSend
  }, function(result) { 
    // Do Some action
});

app.js

chrome.extension.onRequest.addListener( function(message, sender, 
 sendResponse) {
  if(message.title === 'giveSomeTitle'){
    // Do some action with message.params
    sendResponse(true);
  }
});
Гопал Б. Шимпи
источник
sendRequest использование не рекомендуетсяsendMessage
user889030
1

Отключите, если в браузере установлено какое-либо антивирусное расширение. В моем случае виновником было расширение антивируса.

Rajeet
источник
0

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

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

AnthonyVO
источник
0

Я отправлял данные журнала консоли с одной вкладки на другую, и мне действительно не нужна была первая консоль. Однако сообщение об ошибке вызвало ошибку, поэтому я щелкнул правой кнопкой мыши и выбрал «не показывать сообщения с веб-сайта x». Может это самое простое решение :)

Youss
источник