Comment résoudre le problème de chrome 'Unchecked runtime.lastError: Le port de message s'est fermé avant qu'une réponse ne soit reçue'?

139

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

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

Triumf Maqedonci
la source
3
Avez-vous un bloqueur de publicité?
Maelig
1
Vérifiez ma réponse à cette autre demande: stackoverflow.com/questions/53919591/…
Dolfiz
3
Merci les gars, le problème était l'extension "Video Downloader professional".
Triumf Maqedonci
2
Même chose pour moi, Video Downloader professional produisait de telles erreurs
sinedsem
1
Voter pour fermer, car la solution acceptée est un problème de configuration et ne concerne pas la résolution / la compréhension de la cause du problème de programmation.
Greg Domjan

Réponses:

165

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

MirekH
la source
20
MeddleMonkey disabled
terantul
7
J'ai eu ce problème, a été causé par l'extension Norton Safe Search
Boardy
7
Dans mon cas, l'extension était Google Publisher Toolbar
Leandro Castro
3
Pour moi, c'était "Norton Safe Web".
frankfurt-laravel
2
En quoi la désactivation de toutes les extensions est-elle une solution ... ou même une considération. Pour beaucoup d'entre nous, les extensions fournissent des fonctionnalités essentielles.
Vince
53

Si vous êtes un développeur d'extension qui a cherché sur Google 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 tels que -

Le blocage de lecture d'origine croisée (CORB) a bloqué la réponse d'origine croisée 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 le dit MDN :

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

  • retourne true de l'écouteur d'événements. Cela maintient la fonction sendResponse valide après le retour de l'écouteur, afin que vous puissiez 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 que vous n'utilisez aucun de ces mécanismes, l' sendResponseargument fourni àsendMessage devient hors de portée et le résultat est exactement comme le message d'erreur l'indique: votre port de message (l'appareil de transmission de messages) est fermé avant que la réponse ne soit reçu.

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

En fin de compte, si vous voyez que votre extension est à l'origine de ces erreurs, inspectez attentivement tous vos écouteurs onMessage. Certains d'entre eux ont probablement besoin de commencer à renvoyer des promesses (les marquer comme asynchrones devrait suffire). [Merci @vdegenne]

Ofek Shilon
la source
4
En guise d'avertissement, ne l'utilisez pas async/awaitpour votre rappel d'auditeur en arrière-plan. C'est ce qui a échoué pour moi, j'ai supprimé asyncet transformé ma awaitstructure en un thencode de structure et maintenant ça marche.
vdegenne
mais ... je n'essaye pas d'envoyer de réponse, et je n'en attend pas une!
Michael
Quelle bonne solution, merci! Tout ce que j'avais à faire est d'ajouter return true;en bas de ma fonction chrome.runtime.onMessage.addListener () et le problème a été résolu! J'utilise jQuery $.ajaxdans cette fonction, c'est pourquoi j'ai besoin de ce correctif.
RcoderNY
42

Si vous allez sur chrome: // extensions / , vous pouvez simplement basculer chaque extension une par une et voir laquelle est réellement à l'origine du problème.

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

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

Aguayma
la source
2
Dans mon cas, c'était l'extension 1password
Alexander Kim
dans mon cas, c'était Analyseur de contraste de couleur
Michael Liquori
2
Dans mon cas c'était Google Publisher Toolbarsous Vivaldivivaldi://extensions
Shim-Sao
Oui, désactivez les extensions une par une. J'ai compris qu'il y avait plusieurs extensions à l'origine de l'erreur! Merci
Jose Mhlanga
17

Le message est plutôt ancien et n'est pas étroitement lié au développement d'extensions Chrome, mais laissez-le être ici.

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

Voici un exemple simple de background.js . Il répond à tout 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 annuliez le commentaire de 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"
  ]
}
Aleksej Vasinov
la source
Cela a fonctionné pour moi! Quel scénario par défaut return falseserait utile?
Eduardo Reis le
Docs dit : This function becomes invalid when the event listener returns, unless you return true. Que signifie invalide? ne suppose-t-il pas qu'il soit créé à chaque fois qu'il reçoit un message de toute façon?
Eduardo Reis le
@EduardoReis, avec FALSE, il pourrait être utilisé comme indicateur pour notifier un événement.
Aleksej Vasinov le
14

J'ai répondu à ce sujet .

Dans mon cas, le problème était dû à Video Downloader professionaletAdBlock

En bref, ce problème se produit en raison de certains plugins Google Chrome

nokieng
la source
6

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.

UPD. 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 navigation privée"

airush
la source
4

Pour ceux qui viennent ici pour déboguer cette erreur dans Chrome 73, une possibilité est que Chrome 73 et les versions ultérieures interdisent 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 que "Nos données montrent que la plupart des extensions ne seront pas affectées par ce changement."

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

MISE À JOUR : J'ai résolu le problème des COR mais je vois toujours cette erreur. Je soupçonne que c'est la faute de Chrome ici.

Jonathan Lin
la source
4

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

Je recommande d'installer ce désactivateur d'extension en un clic , 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! ✌️

Ahmad Awais
la source
2

Dans mon cas, c'était l'extension Chrome OneTab.

Suleman
la source
2

Assurez-vous que vous utilisez la syntaxe correcte.

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

Voici un exemple simple de contentScript.js Il 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);
  }
});
Gopal B Shimpi
la source
sendRequest est une utilisation obsolètesendMessage
user889030
1

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

Rajeet
la source
0

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

Le point d'arrêt était dans un morceau de code de rendu moyennement 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.

AnthonyVO
la source
0

J'envoyais les données du journal de la 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 cliqué avec le bouton droit de la souris et sélectionné "ne pas afficher les messages du site Web x". C'est peut-être la solution la plus simple :)

Youss
la source