Chrome: Ungefangener SyntaxError: Unerwartetes Ende der Eingabe

176

Beim Laden meiner Seite in Google Chrome wird in der Konsole ein vager Fehler angezeigt:

Nicht erfasster SyntaxError: Unerwartetes Ende der Eingabe

Ich habe keine Ahnung, was es verursacht. Wie würde ich vorgehen, um diesen Fehler zu debuggen?

dlaurent86
quelle
2
Wenn Sie die Antwort in einem Netzwerk-Sniffer überprüfen, erhalten Sie möglicherweise einen Hinweis. Ich vermute, dass der Content-lengthHeader mehr Bytes angibt, als die Antwort enthält, oder dass der Server möglicherweise ungültiges HTML sendet.
tdammers
2
Meistens fehlt} (Javascript). Überprüfen Sie das Ende Ihrer Klassen und Funktionen. Fügen Sie am Ende Ihres Skripts einfach ein weiteres Closing} hinzu und formatieren Sie Ihren Code erneut automatisch. Wenn Ihr Code eine seltsame Einrückung enthält, ist wahrscheinlich irgendwo zuvor die Stelle, an der ein} verschwunden ist.
OG Sean
Ich hatte dieses Problem beim falschen Laden von JS. Ich lud es als <script>https://example.com/a.js</script>und es hätte sein sollen<script src="https://example.com/a.js"></script>
Daniel Apt
Ich erhalte diesen Fehler heute auf Google Sheets. Ich vermute, dass eine ihrer JS-Dateien so groß ist, dass sie beendet wird, ohne vollständig geladen zu werden. Oder einer ihrer App-Server hat einen Fehler und schließt die http-Verbindung, bevor die JS-Datei vollständig heruntergeladen wurde.
Teddy

Antworten:

226

Dieser besondere Fehler ist eine ärgerliche Tatsache . In den meisten Fällen ist Ihr JavaScript auf irgendeine Weise kaputt. Zum Beispiel fehlt ein }oder so etwas.

Beispiel gegeben, dies ergibt auch "Unerwartetes Ende der Eingabe":

eval('[{"test": 4}') // notice the missing ]

Die Hauptursache für die Probleme scheint jedoch zu sein, dass die angeforderte JSON-URL einen Inhaltstyp hat, von text/htmldem Chrome anscheinend versucht, ihn als HTML zu analysieren, was dann zu einem unerwarteten Ende der Eingabe führt, da die enthaltenen Bild-Tags vorhanden sind analysiert.

Versuchen Sie, den Inhaltstyp auf text/plainIch denke, er sollte die Probleme beheben.

Trotzdem könnte V8 einen besseren Job machen, wenn man genau sagt, wo die Eingabe unerwartet endete.

Ivo Wetzel
quelle
2
ok Vielen Dank, ich habe die json-Anfrage alle zusammen entfernt und der Fehler ist verschwunden. Ich muss noch herausfinden, was genau mit meiner json-Anfrage falsch ist. Ich hatte einfach keine Ahnung, wo ich mit dem Debuggen anfangen sollte. wenn ich fragen darf, wie haben Sie die Grundursache ermittelt
dlaurent86
2
Es könnte nicht so offensichtlich sein. Ich habe diesen Fehler bei minimiertem JS erhalten, weil er vom Minimierer beschädigt wurde, während das nicht minimierte JS vollkommen legal und gültig war. Leider zeigt Chrome nur die Zeile an, in der der Fehler auftritt, was bei minimiertem JS normalerweise die gesamte Datei ist ...
Cerin
Nicht so sehr dort, wo die Eingabe endete (denn das wäre am Ende). Zu wissen, was erwartet wurde, würde Tonnen helfen.
AndrewS
Rettete meinen Schwanz. Ich war furchtbar verärgert über die Mehrdeutigkeit. Vielen Dank.
Zypern 106
4
Ich hatte den gleichen Fehler, weil ich JSON.parse (Text) verwendete und der Textwert eine leere Zeichenfolge war
A Khudairy
73

Versuchen Sie Firebug für Mozilla - es zeigt die Position der Vermissten }.

http://getfirebug.com/


quelle
12
Ich brauchte keinen Firebug. Die Konsole in Firefox sagte mir genau, welche Zeile und welcher Charakter fehlte
Dylan Valade
1
Ich brauchte auch keinen Feuerwehrmann. Die Firefox-Konsole ctrl+shift+iwird es Ihnen sagen.
Benjamin Crouzier
1
Warnung: Wenn das Skript auf eine einzige enorme Zeile minimiert ist, muss Firefox einige Minuten / Stunden / Jahre hängen bleiben.
Cerin
1
Dies ist bei weitem der einfachste Weg, um diese Syntaxfehler
aufzuspüren
Mein Gott, danke. Ich bin der Meinung, dass Chrom im Vergleich zu Firefox in Bezug auf Entwicklerwerkzeuge so weit voraus ist. Es ist erstaunlich, wie es nicht gelingt, dieses kleine Ding richtig zu machen. rettete mich vor großen Kopfschmerzen!
Jesaja Lee
33

Siehe meinen Fall zu einer anderen ähnlichen Frage :

In meinem Fall habe ich versucht, einen leeren JSON zu analysieren:

JSON.parse(stringifiedJSON);

Mit anderen Worten, was geschah, war Folgendes:

JSON.parse("");
Falsarella
quelle
2
Ja, ich hatte auch diesen! Sie können leicht lösen, indem Sie "{}" anstelle einer leeren Zeichenfolge
angeben
1
Ich habe aufgrund eines doppelten Schrägstrichs in einer URL (z. B. localhost: 8080 // mypath / blagh) einen leeren JSON-Wert erhalten, und der Server hat daraufhin eine leere Antwort zurückgegeben.
Jpierson
1
Ich bin hierher gekommen, um diese Lösung zu bestätigen.
Luís Assunção
10

Ich erhalte diesen Fehler, wenn ich ein schließendes Klammerzeichen ( }) im JavaScript-Code ausgelassen habe . Überprüfen Sie, ob Ihre Zahnspangen richtig ausbalanciert sind.

HBP
quelle
10

Für die Aufzeichnung, für jeden, der versucht, die verschiedenen Ursachen für diesen Fehler zu finden. Ein leeres HTML5-Datenattribut

data-mydata = ''

verursacht auch den Fehler. Sie sollten überprüfen, ob der Datenwert eine Nullzeichenfolge ist und das Attribut überhaupt nicht enthalten. Es versteht sich von selbst, dass dies für skriptgeneriertes HTML weitgehend relevant ist.

DroidOS
quelle
Ohne dich hätte ich das nie herausgefunden. Ich habe VideoJS verwendet und das HTML für den Video-Player von der Seite kopiert. Es hatte einen Platzhalter für Datenattribute, den Sie verwenden konnten, aber ich war es nicht. Das Video wurde nicht geladen und ich bekam den Fehler, über den alle reden. Nach dem Löschen hat data-setup='{"example_option":true}' alles super geklappt.
Tyler Buchea
1
@ user1002379, froh, dass ich helfen konnte.
DroidOS
8

Das Problem für mich war, dass ich $ .ajax dataType: "json"für eine POST-Anfrage ausführte , die ein HTTP 201 (erstellt) und keinen Anfragetext zurückgab. Die Lösung bestand darin, diesen Schlüssel / Wert einfach zu entfernen.

Blaskovicz
quelle
Ich habe eine Ajax-Anfrage (Upload) gestartet und abgebrochen, bevor sie abgeschlossen war, und ich habe diesen Fehler erhalten.
Dustin Poissant
6

JSHint ist gut darin, die Position fehlender Klammern oder einer schlechten Syntax zu finden.

Harfatum
quelle
6

Eine weitere Ursache für diesen Fehler: Wenn Ihre API absichtlich ohne Antworttext antwortet, jedoch mit einem 200 OKStatuscode anstelle eines 204 No ContentStatuscodes. Einige JavaScript-Bibliotheken reagieren möglicherweise nicht gut auf unerwartete Inhaltstypen, wenn kein Inhalt vorhanden ist. Verwenden Sie daher den richtigen Statuscode!

Andrew
quelle
3

Es wird definitiv eine offene Klammer geben, die den Fehler verursacht hat.

Ich würde vorschlagen, dass Sie die Seite in Firefox öffnen, dann Firebug öffnen und die Konsole überprüfen - es wird das fehlende Symbol angezeigt.

Beispiel-Screenshot:

Firebug, der den Fehler hervorhebt

MKD
quelle
2

Mein Problem war mit dem Google Chrome-Cache. Ich habe dies getestet, indem ich meine Webanwendung unter Firefox ausgeführt habe, und habe diesen Fehler dort nicht erhalten. Also habe ich beschlossen, den Cache von Google Chrome zu leeren, und es hat funktioniert.

Amir Al
quelle
1

In Fällen, in denen Ihr JavaScript-Code auf eine einzelne Zeile reduziert ist, wird //anstelle von eine andere Ursache für diesen Fehler verwendet/**/ Ihrer Kommentare .

Schlecht (kommentiert alles nach //dem Schließen }für Ihre Funktion aus)

function example() { //comment console.log('TEST'); }

Gut (beschränkt Ihren Kommentar)

function example() { /* comment */ console.log('TEST'); }
Johan Doe
quelle
Arbeitete, Plus, sollten Sie "the-text" verwenden, da sich "the-text" auch für das Casting bezieht.
Bay
1

In meinem Fall habe ich Javascript dynamisch hinzugefügt und zweimal doppelte Anführungszeichen in Zeichenfolgenvorlagen verwendet, sodass ich die zweite in einfache Anführungszeichen geändert habe und der Fehler behoben war. Ich hoffe, es wird einigen Leuten helfen, die aus dem gleichen Grund hierher kommen.

George_kane
quelle
Mit addthis habe ich die URL mit einer doppelten Zeichenfolge angehängt und dann in ein einfaches Anführungszeichen geändert, und der Konsolenfehler ist verschwunden
tfa
0

Ich hatte ein ähnliches Problem mit der Verwendung der UI-Bootstrap-Direktive für anglejs - uib-datepicker, wenn ich am / pm umschalte.

Fehler in der Ereignisbehandlungsroutine für (unbekannt): SyntaxError: Unerwartetes Ende der Winkelauswahl der JSON-Eingabe

Es stellte sich heraus, dass es am Plugin 'Trans-over' lag (das ein Wort übersetzt, wenn es angeklickt wird). Vielleicht hilft meine Antwort jemandem, weil ich im Internet nichts gefunden habe.

OlehZiniak
quelle
0

Da es sich um eine asynchrone Operation handelt, die onreadystatechangemöglicherweise vor dem Laden des Werts in den responseText auftritt, versuchen Sie mit a, window.setTimeout(function () { JSON.parse(xhr.responseText); }, 1000); um festzustellen, ob der Fehler weiterhin besteht. BOL

Safhac
quelle
0

Ich hatte diesen Fehler und habe ihn behoben, indem ich den Schutz hinzugefügt readyStateund statushier gezeigt habe:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
          // Your code here
   }
};
Backstein
quelle
0

Wenn beim Anchor-Tag ein Fehler aufgetreten ist, ersetzen Sie einfach "Onclick" durch "href" oder "href" durch "Onclick".

Harsha Annareddy
quelle
0

Das Setzen des AcceptHeaders auf application/jsonin der Anfrage hat bei mir funktioniert, als ich auf dasselbe Problem stieß.

Stefano Populin
quelle
0

Der Versuch, einen leeren JSON zu analysieren, kann die Ursache für diesen Fehler sein.

Wenn Sie eine Antwort vom Server oder was auch immer erhalten, überprüfen Sie zuerst, ob diese nicht leer ist. Beispielsweise:

function parseJSON(response) {
    if (response.status === 204 || response.status === 205) {
        return null;
    }
    return response.json();
}

Dann können Sie holen mit:

fetch(url, options).then(parseJSON); 
Rivelbab
quelle