Як виправити хронічну проблему "Не перевірено runtime.lastError: Порт повідомлення закритий до отримання відповіді"?


138

Я використовую VueJS та Laravel для свого проекту. Цей випуск почав з’являтися недавно, і він відображається навіть у старих гіт гет.

Ця помилка відображається лише в браузері Chrome.


3
Чи є у вас блокувальник реклами?
Меліг

1
Перевірте свою відповідь на цей інший запит: stackoverflow.com/questions/53919591 / ...
Dolfiz

3
Спасибі, хлопці, проблемою було розширення "Video Downloader professional".
Triumf Maqedonci

2
Те саме для мене професіонал Video Downloader видав такі помилки
sinedsem

1
Голосування про закриття, оскільки прийняте рішення є проблемою конфігурації і не стосується виправлення / розуміння причини проблеми програмування.
Грег Дом’ян

Відповіді:


164

Я відключив усі встановлені розширення в Chrome - працює для мене. Тепер у мене прозора консоль без помилок.


20
MeddleMonkey інвалід
terantul

6
У мене ця проблема була викликана розширенням безпечного пошуку Norton
Boardy

7
У моєму випадку розширенням була панель інструментів Google Publisher
Леандро Кастро

3
Для мене це була "безпечна павутина Нортона".
Франкфурт-ларавель

2
Як відключення всіх розширень є рішенням ... або навіть розглядом. Для багатьох з нас розширення забезпечують важливу функціональність.
Вінс

53

У випадку, якщо ви розробник розширень, який переглянув ваш шлях, намагаючись зупинити причину цієї помилки:

Проблема не CORB, оскільки заблоковані CORs виявляються як попередження -

Блокування перехресного походження читання (CORB) блокувало відповідь на поперечне походження https://www.example.com/example.html із текстом / html- форматом MIME. Докладнішу інформацію див. На https://www.chromestatus.com/feature/5629709824032768 .

Ця проблема, швидше за все, неправильна відповідь асинхронізації на runtime.sendMessage. Як каже MDN :

Щоб надіслати асинхронну відповідь, є два варіанти:

  • повернути правду від слухача події. Це зберігає функцію sendResponse дійсною після повернення слухача, тому ви можете зателефонувати пізніше.
  • повернути Обіцянку від слухача події та вирішити, коли у вас є відповідь (або відхилити її у випадку помилки).

Коли ви надсилаєте відповідь асинхронізації, але не використовуєте жоден із цих механізмів, наданий sendResponseаргумент sendMessageвиходить за межі сфери дії, і результат точно такий, як говорить повідомлення про помилку: ваш порт повідомлення (апарат передачі повідомлень) закритий до того, як відповідь була отримано.

Автори Webextension-polyfill вже писали про це у червні 2018 року .

Отже, підсумок, якщо ви бачите, що розширення викликає ці помилки - уважно ознайомтеся зі всіма слухачами програми onMessage. Деякі з них, ймовірно, повинні почати повертати обіцянки (позначення їх як асинхронізації повинно бути достатньо). [Дякую @vdegenne]


4
Як голова не використовуйте async/awaitдля зворотного виклику фонового слухача. Це для мене не вдалося, я видалив asyncі перетворив свою awaitструктуру в thenструктуру коду, і тепер вона працює.
вдегенне

але ... я не намагаюся надіслати жодної відповіді, і не очікую на неї!
Михайло

Яке чудове виправлення, дякую! Все, що мені потрібно було зробити, - це додати return true;внизу моєї функції chrome.runtime.onMessage.addListener (), і проблема була вирішена! Я використовую jQuery $.ajaxвсередині цієї функції, тому мені потрібно це виправлення.
RcoderNY

42

Якщо перейти до chrome: // extensions / , ви можете просто переключити кожне розширення по одному і побачити, яке з них насправді викликає проблему.

Після вимкнення розширення оновіть сторінку, де ви бачите помилку, і помахуєте мишкою навколо або натисніть. Дії миші - це речі, які призводять до помилок.

Тож я зміг точно визначити, яке розширення насправді викликало проблему, і відключити її.


2
У моєму випадку це було розширення 1password
Олександр Кім

у моєму випадку це був аналізатор контрастності кольорів
Michael Liquori

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 , який надсилає повідомлення на спливаюче вікно. Ви отримуватимете винятки, поки не відміните коментар рядок "повернути справжню" у файл 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


6

Якщо причиною помилки є розширення, використовуйте інкогніто Ctrl+ Shift+N . У режимі інкогніто Chrome не має розширень.

UPD. Якщо вам потрібне деяке розширення в режимі анонімного перегляду, наприклад ReduxDevTools або будь-яке інше, у налаштуваннях розширення увімкніть "Дозволити в режимі анонімного перегляду"


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 вважає, що "Наші дані показують, що ці зміни не вплинуть на більшість розширень".

(це не має нічого спільного з кодом вашого додатка)

ОНОВЛЕННЯ : Я виправив проблему CORs, але все ще бачу цю помилку. Я підозрюю, що тут винна Chrome.


4

Ця помилка, як правило, викликана одним із ваших розширень Chrome.

Рекомендую встановити цей вимикач розширення одним клацанням , я використовую його за допомогою комбінації клавіш COMMAND (⌘)+ SHIFT (⇧)+D - для швидкого відключення / включення всіх моїх розширень.

Після відключення розширень це повідомлення про помилку повинне піти.

Мир! ✌️



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

Вимкнути, якщо в браузері встановлено якесь антивірусне розширення. У моєму випадку винуватцем стало антивірусне розширення.



0

У моєму випадку це була точка розриву, встановлена ​​в моєму власному джерелі сторінки. Якщо я видалив або відключив точку розриву, помилка буде видалена.

Точка розриву була в помірно складному фрагменті коду візуалізації. Інші точки перерви в різних частинах сторінки не мали такого ефекту. Мені не вдалося розробити простий тестовий випадок, який завжди викликає цю помилку.


0

Я надсилав дані журналу консолі з однієї вкладки на іншу і не дуже потребував першої консолі. Однак повідомлення про помилку зробило помилку, тому я натиснув правою кнопкою миші та вибрав "не показувати повідомлення з x веб-сайту". Можливо, це найлегше виправити :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.