web-dev-qa-db-fra.com

Comment résoudre le problème «Unchecked runtime.lastError: le port de message s'est fermé avant la réception d'une réponse» chrome?

J'utilise VueJS et Laravel pour mon projet. Ce problème a commencé à apparaître récemment et il apparaît même dans les anciennes branches git.

Cette erreur n'apparaît que dans le navigateur Chrome.

102
Triumf Maqedonci

J'ai désactivé toutes les extensions installées dans Chrome - fonctionne pour moi. J'ai maintenant effacé la console sans erreurs.

106
MirekH

Si vous accédez à chrome: // extensions / , vous pouvez simplement basculer chaque extension une par une et voir laquelle déclenche réellement le problème.

Une fois que vous avez désactivé l'extension, actualisez la page où vous voyez l'erreur et agitez la souris, ou cliquez sur. Les actions de la souris sont les choses qui génèrent des erreurs.

J'ai donc pu identifier quelle extension causait réellement le problème et la désactiver.

35
Aguayma

Dans le cas où vous êtes un développeur d'extensions et que vous avez recherché votre chemin ici en essayant d'arrêter de provoquer cette erreur:

Le problème n'est pas CORB, car les COR bloqués se manifestent par des avertissements comme -

Cross-Origin Read Blocking (CORB) a bloqué la réponse cross-Origin https://www.example.com/example.html avec le type MIME text/html. Voir https://www.chromestatus.com/feature/5629709824032768 pour plus de détails.

Le problème est probablement une réponse asynchrone mal gérée à runtime.sendMessage. Comme MDN dit :

Pour envoyer une réponse asynchrone, il existe deux options:

  • renvoie true depuis l'écouteur d'événement. Cela maintient la fonction sendResponse valide après le retour de l'écouteur, vous pouvez donc l'appeler plus tard.
  • renvoyer une promesse de l'écouteur d'événements et résoudre lorsque vous avez la réponse (ou la rejeter en cas d'erreur).

Lorsque vous envoyez une réponse asynchrone mais ne parvenez pas à utiliser l'un de ces mécanismes, l'argument sendResponse fourni à sendMessage sort du domaine et le résultat est exactement comme le message d'erreur le dit: votre port de message ( l'appareil de transmission des messages) est fermé avant la réception de la réponse.

Les auteurs de Webextension-polyfill ont déjà écrit à ce sujet en juin 2018 .

Donc, en fin de compte, si vous voyez que votre extension provoque ces erreurs - inspectez attentivement tous vos écouteurs onMessage. Certains d'entre eux doivent probablement commencer à renvoyer des promesses (les marquer comme asynchrones devrait suffire).

23
Ofek Shilon

J'ai répondu le this .

Dans mon cas, le problème était dû à Video Downloader professional et AdBlock

En bref, ce problème se produit en raison de certains plugins google chrome

14
nokieng

La publication est assez ancienne et n'est pas étroitement liée au développement des extensions Chrome, mais laissez-le ici.

J'ai eu le même problème lors de la réponse au message de rappel. La solution consiste à retourner true dans l'écouteur de messages en arrière-plan.

Voici un exemple simple de background.js. Il répond à n'importe quel message de 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
});

Voici popup.js, qui envoie un message sur popup. Vous obtiendrez des exceptions jusqu'à ce que vous dé-commentiez la ligne "return true" dans le fichier background.js.

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

manifest.json, juste au cas où :) Faites attention à la section des autorisations d'alarme!

{
  "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"
  ]
}
13
Aleksej Vasinov

Si la raison de l'erreur est l'extension, utilisez incognito Ctrl+Shift+N. En mode navigation privée Chrome n'a pas d'extensions.

PD. Si vous avez besoin d'une extension en mode navigation privée, par exemple ReduxDevTools ou tout autre, dans les paramètres d'extension, activez "Autoriser en mode incognito"

7
airush

Pour ceux qui viennent ici pour déboguer cette erreur dans Chrome 73, une possibilité est parce que Chrome 73 à partir de maintenant interdit les demandes d'origine croisée dans les scripts de contenu).

Plus de lecture:

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

Cela affecte de nombreux auteurs d'extensions Chrome, qui doivent maintenant se démener pour corriger les extensions car Chrome pense "Nos données montrent que la plupart des extensions ne seront pas affectées par cette changement."

(cela n'a rien à voir avec le code de votre application)

[~ # ~] mise à jour [~ # ~] : J'ai corrigé le problème des CORs mais je vois toujours cette erreur. Je soupçonne que c'est la faute de Chrome ici.

4
Jonathan Lin

Dans mon cas, c'était OneTab chrome.

2
Suleman

Assurez-vous que vous utilisez la syntaxe correcte.

Nous devons utiliser la méthode sendMessage () après l'avoir écoutée.

Voici un exemple simple de contentScript.js Il envoie une demande à 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);
  }
});
1
Gopal B Shimpi

Désactivez si une extension antivirus est installée sur le navigateur. Dans mon cas, l'extension antivirus était le coupable.

0
Rajeet

Cette erreur est généralement causée par l'une de vos extensions Chrome.

Je recommande d'installer ce One-Click Extension Disabler , je l'utilise avec le raccourci clavier COMMAND (⌘)SHIFT (⇧)D - pour désactiver/activer rapidement toutes mes extensions.

Une fois les extensions désactivées, ce message d'erreur devrait disparaître.

Paix! ✌️

0
Ahmad Awais

J'envoyais des données de journal de console d'un onglet à un autre et je n'avais pas vraiment besoin de la première console. Cependant, le message d'erreur m'a dérangé, j'ai donc fait un clic droit et sélectionné "ne pas afficher les messages du site x". C'est peut-être la solution la plus simple :)

0
Youss

Dans mon cas, c'était un point d'arrêt défini dans ma propre source de page. Si j'ai supprimé ou désactivé le point d'arrêt, l'erreur disparaîtrait.

Le point d'arrêt se trouvait dans un morceau de code de rendu modérément complexe. D'autres points d'arrêt dans différentes parties de la page n'ont pas eu un tel effet. Je n'ai pas pu élaborer un cas de test simple qui déclenche toujours cette erreur.

0
AnthonyVO

Pour moi, c'était Auto Tab Discard, qui renvoie cette erreur sur les onglets épinglés. J'ai créé un rapport de bogue, https://github.com/rNeomy/auto-tab-discard/issues/101 .

0
RiZKiT