Wie kann das Chrome-Problem "Unchecked runtime.lastError: Der Nachrichtenport wurde geschlossen, bevor eine Antwort empfangen wurde" behoben werden?

137

Ich benutze VueJS und Laravel für mein Projekt. Dieses Problem wurde in letzter Zeit angezeigt und zeigt sich sogar in den alten Git-Zweigen.

Dieser Fehler wird nur im Chrome-Browser angezeigt.

Triumf Maqedonci
quelle
3
Haben Sie einen Werbeblocker?
Maelig
1
Überprüfen Sie meine Antwort auf diese andere Anfrage: stackoverflow.com/questions/53919591/…
Dolfiz
3
Danke Jungs, das Problem war die Erweiterung "Video Downloader Professional".
Triumf Maqedonci
2
Das gleiche gilt für mich, Video Downloader Professional produzierte solche Fehler
sinedsem
1
Die Abstimmung zum Schließen, da die akzeptierte Lösung ein Konfigurationsproblem darstellt und sich nicht auf das Beheben / Verstehen der Ursache des Programmierproblems bezieht.
Greg Domjan

Antworten:

162

Ich habe alle in Chrome installierten Erweiterungen deaktiviert - funktioniert für mich. Ich habe jetzt Konsole ohne Fehler gelöscht.

MirekH
quelle
20
MeddleMonkey deaktiviert
terantul
6
Ich hatte dieses Problem, wurde durch die Norton Safe Search Extension
Boardy
7
In meinem Fall war die Erweiterung Google Publisher Toolbar
Leandro Castro
1
Ich hatte die Erweiterung "Video Speed ​​Controller" in einem defekten Zustand. Reparierte es dann war der Fehler weg.
Alielson Piffer
3
Für mich war es "Norton Safe Web".
Frankfurt-Laravel
49

Falls Sie ein Erweiterungsentwickler sind, der Ihren Weg hierher gegoogelt hat und versucht, diesen Fehler nicht mehr zu verursachen:

Das Problem ist nicht CORB, da blockierte CORs sich als Warnungen manifestieren wie -

Cross-Origin Read Blocking (CORB) blockierte die Cross-Origin-Antwort https://www.example.com/example.html mit MIME-Typ text / html. Siehe https://www.chromestatus.com/feature/5629709824032768Weitere Informationen finden .

Das Problem ist höchstwahrscheinlich eine falsch behandelte asynchrone Antwort auf runtime.sendMessage. Wie MDN sagt :

Um eine asynchrone Antwort zu senden, gibt es zwei Möglichkeiten:

  • Geben Sie vom Ereignis-Listener true zurück. Dadurch bleibt die Funktion sendResponse nach der Rückkehr des Listeners gültig, sodass Sie sie später aufrufen können.
  • Geben Sie ein Versprechen vom Ereignis-Listener zurück und lösen Sie es auf, wenn Sie die Antwort erhalten (oder lehnen Sie es im Fehlerfall ab).

Wenn Sie eine asynchrone Antwort senden, aber keinen dieser Mechanismen verwenden, verlässt das angegebene sendResponseArgument den sendMessageGültigkeitsbereich und das Ergebnis entspricht genau der Fehlermeldung: Ihr Nachrichtenport (der Nachrichtenübermittlungsapparat) wird geschlossen, bevor die Antwort war empfangen.

Webextension-Polyfill-Autoren haben bereits im Juni 2018 darüber geschrieben .

Wenn Sie also feststellen, dass Ihre Erweiterung diese Fehler verursacht, überprüfen Sie alle Ihre onMessage-Listener genau. Einige von ihnen müssen wahrscheinlich anfangen, Versprechen zurückzugeben (es sollte ausreichen, sie als asynchron zu markieren). [Danke @vdegenne]

Ofek Shilon
quelle
4
Als Heads-Up nicht async/awaitfür Ihren Hintergrund-Listener-Rückruf verwenden. Dies ist, was für mich fehlgeschlagen ist, ich habe asyncmeine awaitStruktur entfernt und in einen thenStrukturcode umgewandelt und jetzt funktioniert es.
Vdegenne
aber ... ich versuche nicht, eine Antwort zu senden, noch erwarte ich eine!
Michael
Was für eine großartige Lösung, danke! Alles was ich tun musste, war return true;am Ende meiner Funktion chrome.runtime.onMessage.addListener () hinzuzufügen und das Problem wurde gelöst! Ich verwende jQuery's $.ajaxin dieser Funktion, weshalb ich dieses Update benötige.
RcoderNY
42

Wenn Sie zu chrome: // extensions / gehen , können Sie einfach jede Erweiterung einzeln umschalten und sehen, welche das Problem tatsächlich auslöst.

Wenn Sie die Erweiterung deaktiviert haben, aktualisieren Sie die Seite, auf der der Fehler angezeigt wird, und bewegen Sie die Maus oder klicken Sie. Mausaktionen sind die Dinge, die Fehler auslösen.

So konnte ich genau bestimmen, welche Erweiterung das Problem tatsächlich verursachte, und es deaktivieren.

Aguayma
quelle
2
In meinem Fall war es 1 Passwort Erweiterung
Alexander Kim
In meinem Fall war es Color Contrast Analyzer
Michael Liquori
2
In meinem Fall war es Google Publisher Toolbarunter Vivaldivivaldi://extensions
Shim-Sao
Ja, deaktivieren Sie die Erweiterungen nacheinander. Ich habe herausgefunden, dass es mehrere Erweiterungen gibt, die den Fehler verursachen! Danke
Jose Mhlanga
17

Post ist ziemlich alt und nicht eng mit der Entwicklung von Chrome-Erweiterungen verbunden, aber lassen Sie es hier sein.

Ich hatte das gleiche Problem beim Antworten auf eine Nachricht im Rückruf. Die Lösung besteht darin , im Hintergrundnachrichten-Listener true zurückzugeben .

Hier ist ein einfaches Beispiel für background.js . Es antwortet auf jede Nachricht von 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
});

Hier ist popup.js , das eine Nachricht im Popup sendet. Sie erhalten Ausnahmen, bis Sie den Kommentar "return true" in der Datei background.js entfernen.

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

manifest.json , nur für den Fall :) Achten Sie auf den Abschnitt mit den Alarmberechtigungen!

{
  "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
quelle
Es hat bei mir funktioniert! In welchem ​​Szenario wäre die Standardeinstellung return falsehilfreich?
Eduardo Reis
Docs sagt : This function becomes invalid when the event listener returns, unless you return true. Was bedeutet ungültig? Wird es nicht angenommen, dass es jedes Mal erstellt wird, wenn eine Nachricht empfangen wird?
Eduardo Reis
@EduardoReis, mit FALSE kann es als Informant verwendet werden, um über ein Ereignis zu benachrichtigen.
Aleksej Vasinov
14

Ich habe auf beantwortet diese .

In meinem Fall lag das Problem an Video Downloader professionalundAdBlock

Kurz gesagt, dieses Problem tritt aufgrund einiger Google Chrome-Plugins auf

nokieng
quelle
7

Wenn der Fehler die Erweiterung ist, verwenden Sie inkognito Ctrl+ Shift+N . Im Inkognito-Modus hat Chrome keine Erweiterungen.

UPD. Wenn Sie im Inkognito-Modus eine Erweiterung benötigen, z. B. ReduxDevTools oder eine andere, aktivieren Sie in den Erweiterungseinstellungen "Inkognito zulassen".

Airush
quelle
4

Für diejenigen, die hierher kommen, um diesen Fehler in Chrome 73 zu debuggen, besteht eine Möglichkeit darin, dass ab Chrome 73 Ursprungsübergreifende Anforderungen in Inhaltsskripten nicht mehr zulässig sind.

Lesen Sie mehr:

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

Dies betrifft viele Autoren von Chrome-Erweiterungen, die jetzt verschlüsseln müssen, um die Erweiterungen zu reparieren, da Chrome der Meinung ist, dass "unsere Daten zeigen, dass die meisten Erweiterungen von dieser Änderung nicht betroffen sind".

(Es hat nichts mit Ihrem App-Code zu tun.)

UPDATE : Ich habe das COR-Problem behoben, sehe aber immer noch diesen Fehler. Ich vermute, es ist Chrome's Schuld hier.

Jonathan Lin
quelle
4

Dieser Fehler wird im Allgemeinen durch eine Ihrer Chrome-Erweiterungen verursacht.

Ich empfehle, diesen One-Click Extension Disabler zu installieren . Ich verwende ihn mit der Tastenkombination COMMAND (⌘)+ SHIFT (⇧)+ D-, um alle meine Erweiterungen schnell zu deaktivieren / aktivieren.

Sobald die Erweiterungen deaktiviert sind, sollte diese Fehlermeldung verschwinden.

Frieden! ✌️

Ahmad Awais
quelle
2

In meinem Fall war es eine OneTab-Chrome-Erweiterung.

Suleman
quelle
2

Stellen Sie sicher, dass Sie die richtige Syntax verwenden.

Wir sollten die sendMessage () -Methode verwenden, nachdem wir sie angehört haben.

Hier ist ein einfaches Beispiel für contentScript.js Es sendeanfrage zu 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
quelle
1

Deaktivieren Sie diese Option, wenn im Browser eine Antiviren-Erweiterung installiert ist. In meinem Fall war die Antiviren-Erweiterung der Schuldige.

Rajeet
quelle
0

In meinem Fall war es ein Haltepunkt, der in meiner eigenen Seitenquelle festgelegt wurde. Wenn ich den Haltepunkt entfernen oder deaktivieren würde, würde der Fehler behoben.

Der Haltepunkt befand sich in einem mäßig komplexen Teil des Rendering-Codes. Andere Haltepunkte in verschiedenen Teilen der Seite hatten keinen solchen Effekt. Ich konnte keinen einfachen Testfall ausarbeiten, der diesen Fehler immer auslöst.

AnthonyVO
quelle
0

Ich habe Konsolenprotokolldaten von einer Registerkarte zur anderen gesendet und brauchte die erste Konsole nicht wirklich. Die Fehlermeldung hat mich jedoch gestört, sodass ich mit der rechten Maustaste geklickt und "Keine Nachrichten von der x-Website anzeigen" ausgewählt habe. Vielleicht ist dies die einfachste Lösung :)

Youss
quelle