Nicht gefangener SyntaxError: Unerwartetes Token:

193

Ich führe einen AJAX-Aufruf in meinem MooTools-Skript aus. Dies funktioniert in Firefox einwandfrei, aber in Chrome wird eine Uncaught SyntaxError: Unexpected token :Fehlermeldung angezeigt. Ich kann nicht feststellen, warum. Das Auskommentieren von Code, um festzustellen, wo sich der fehlerhafte Code befindet, ergibt nichts. Ich denke, dass dies ein Problem mit der Rückgabe des JSON sein kann. Beim Einchecken in die Konsole wird Folgendes angezeigt:

{"votes":47,"totalvotes":90}

Ich sehe keine Probleme damit. Warum sollte dieser Fehler auftreten?

vote.each(function(e){
  e.set('send', {
    onRequest : function(){
      spinner.show();
    },
    onComplete : function(){
      spinner.hide();
    },
    onSuccess : function(resp){
      var j = JSON.decode(resp);
      if (!j) return false;
      var restaurant = e.getParent('.restaurant');
      restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
      $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
      buildRestaurantGraphs();
    }
  });

  e.addEvent('submit', function(e){
    e.stop();
    this.send();
  });
});
Trobrock
quelle
1
Der JSON ist in Ordnung. Das Problem ist wahrscheinlich, wie Sie damit umgehen. Das Anzeigen des Codes hilft.
Tcooc
1
Der Codeteil wurde zur Frage hinzugefügt.
Trobrock
An der Syntax, dem JS und dem JSON scheint nichts falsch zu sein. Das Posten eines (nicht) funktionierenden Testfalls auf jsfiddle.net würde helfen - einschließlich HTML.
Oskar Krawczyk
1
Derzeit binde ich das Internet an, sodass mein Modem die HTML-Quelle der von mir durchsuchten Websites komprimiert, sodass ich aus dem Code nicht wirklich Kopf oder Zahl machen kann. Für den Anfang sollten Sie jedoch jeden JS-Code in externe Dateien einfügen - dies erleichtert immer das Debuggen - und Sie wissen, ob der Fehler durch JS oder etwas anderes verursacht wird.
Oskar Krawczyk
2
Ein "unerwartetes Token" ist wahrscheinlich ein unzulässiger Zeichencode. Ein solcher Code wird wahrscheinlich nicht angezeigt, wenn Sie auf der Konsole drucken. Drucken Sie daher die Zeichenfolge zeichenweise aus oder verwenden Sie einen Protokollanalysator, einen Debugger usw., um die tatsächlichen Bytes der Zeichenfolge anzuzeigen.
GroovyDotCom

Antworten:

93

Rote Fehler sehen

Nicht erfasster SyntaxError: Unerwartetes Token <

Auf der Konsolenregisterkarte Ihres Chrome-Entwicklers wird HTML im Antworttext angezeigt.

Was Sie tatsächlich sehen, ist die Reaktion Ihres Browsers auf die unerwartete oberste Zeile <!DOCTYPE html>vom Server.

Andy Magoon
quelle
4
Ich habe keine Ahnung, warum Sie über "Unerwartetes Token <" sprechen, wenn es um Fragen geht Unexpected token :. Ihre Antwort hat nichts mit dem Problem von OP zu tun.
Michał Perłakowski
1
Und wie behebe ich das? Ich habe eine PHP-Weiterleitung, die dies in Chrome verursacht.
Arbeitet für einen
7
Um @andy_magoon hinzuzufügen, hatte ich in meinem Fall ein Skript-Tag, das Javascript bereitstellen sollte, aber weil die Anforderung auf eine HTML-Seite umgeleitet wurde (es ist nicht wichtig, warum sie umgeleitet wurde), die mit <! DOCTYPE html beginnt >, was kein gültiges Javascript ist, gibt der Browser den SyntaxError zurück, wenn er versucht, den HTML-Code als JS zu analysieren.
David.Barkhuizen
2
@Thom Um dies zu beheben, müssen Sie sicherstellen, dass der HTTP-Abruf die gesuchte Javascript-Datei und nicht unerwartetes HTML zurückgibt.
David.Barkhuizen
1
Ich habe genau diesen Fehler erhalten, weil der Dateipfad, wie sich herausstellt, falsch ist und die im Skript-Tag angegebene Datei nicht gefunden werden kann.
Newman
80

Nur zu Ihrer Information für Leute, die möglicherweise das gleiche Problem haben - ich musste nur meinen Server dazu bringen, den JSON als application / json zurückzusenden, und der Standard-jQuery-Handler funktionierte einwandfrei.

Edward Abrams
quelle
4
Ich glaube, ich habe das Gegenteil von diesem Problem. Ich fordere JSON von einer Drittanbieter-API an und sie geben Anwendung / Javascript als Antwort zurück, und ich erhalte denselben Fehler, den Sie in dieser Frage gemeldet haben. Ich bin mir nicht sicher, wie ich damit umgehen soll.
Wuliwong
5
Ein seltsames Problem ist - es funktioniert gut auf dem lokalen Host, aber nicht auf dem Server. Irgendeine Idee warum?
VishwaKumar
Hallo. Ich habe ein genaues Problem und kann es nicht lösen. Kann mir jemand sagen, wie Sie JSON an den Server
Alen,
Vielen Dank, dass ich eine Anwendung / ein Javascript gesendet habe (da ich diese SO falsch gelesen habe ) und diesen Fehler auf einfach gültigem JSON erhalten habe. Ändern inapplication/json um den Fehler beheben. Ich benutze kein JSONP.
Scipilot
Sogar ich erhalte den gleichen Fehler "Ungefangener Syntaxfehler: Unerwartetes Token:", auch nachdem ich die Antwort im JSON-Format erhalten habe {"Erfolg": wahr, "Daten": 2593}
Rupali Pemare
41

Das ist mir gerade passiert, und der Grund war keiner der oben genannten Gründe. Ich habe den jQuery-Befehl getJSON verwendet und hinzugefügt callback=?, um JSONP zu verwenden (da ich domänenübergreifend arbeiten musste), den JSON-Code zurückgegeben {"foo":"bar"}und den Fehler erhalten.

Dies liegt daran, dass ich die Rückrufdaten hätte einschließen sollen, so etwas wie jQuery17209314005577471107_1335958194322({"foo":"bar"})

Hier ist der PHP-Code, den ich verwendet habe, um dies zu erreichen, der sich verschlechtert, wenn JSON (ohne Rückruf) verwendet wird:

$ret['foo'] = "bar";
finish();

function finish() {
    header("content-type:application/json");
    if ($_GET['callback']) {
        print $_GET['callback']."(";
    }
    print json_encode($GLOBALS['ret']);
    if ($_GET['callback']) {
        print ")";
    }
    exit; 
}

Hoffentlich hilft das jemandem in Zukunft.

Grimmig...
quelle
Es hat mir sehr geholfen. Wir sollten die json-Daten mit jsoncallback-Daten umschließen, wenn wir die jsonp-Methode verwenden. Auch die jsonpcallback-Daten sollten nicht mit Zahlen beginnen. Als ich es mit Zahlen versuchte, hat es nicht geklappt. Als ich es mit dem gleichen Format versuchte, das in dieser Antwort gezeigt wurde, funktionierte es ...
Ganesh Babu
Richtig, aber der Fehler ist der gleiche und der Code wird ordnungsgemäß beeinträchtigt und funktioniert weiterhin, wenn JSON verwendet wird.
Grimmig ...
Dies funktionierte bei mir mit AJAX, jQuery & JSONP. Vielen Dank!
Piotr Wittchen
16

Ich habe gerade das Problem gelöst. Es gab etwas, das Probleme mit einem Standardanforderungsaufruf verursachte. Dies ist also der Code, den ich stattdessen verwendet habe:

vote.each(function(element){                
  element.addEvent('submit', function(e){
    e.stop();
    new Request.JSON({
      url : e.target.action, 
      onRequest : function(){
        spinner.show();
      },
      onComplete : function(){
        spinner.hide();
      },
      onSuccess : function(resp){
        var j = resp;
        if (!j) return false;
        var restaurant = element.getParent('.restaurant');
        restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
        $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
        buildRestaurantGraphs();
      }
    }).send(this);
  });
});

Wenn jemand weiß, warum das Standard-Anforderungsobjekt mir Probleme bereitete, würde ich es gerne wissen.

Trobrock
quelle
3
Der Unterschied zwischen Standard Request und Request.json liegt hauptsächlich in den Headern, es fügt hinzu this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- go figure
Dimitar Christoff
Seltsam, dass dies das Problem war.
Trobrock
3
Was sind die Doppel $$dort?
Falsarella
@ DimitarChristoff - jede Antwort für Falsarella über das $$?
Tragen Sie den
1
@bear Der Doppel-Dollar-Selektor ist in MooTools definiert.
Anthony Faull
10

Ich dachte, ich würde mein Problem und meine Lösung zur Liste hinzufügen.

Ich bekam: Uncaught SyntaxError: Unexpected token <und der Fehler zeigte auf diese Zeile in meiner Ajax-Erfolgserklärung:

var total = $.parseJSON(response);

Ich fand später heraus, dass zusätzlich zu den JSON-Ergebnissen HTML mit der Antwort gesendet wurde, weil ich einen Fehler in meinem PHP hatte. Wenn Sie in PHP einen Fehler erhalten, können Sie ihn so einstellen, dass er Sie mit riesigen orangefarbenen Tabellen warnt, und diese Tabellen haben den JSON ausgelöst.

Ich fand das heraus, indem ich einfach ein console.log(response)machte, um zu sehen, was tatsächlich gesendet wurde. Wenn es sich um ein Problem mit den JSON-Daten handelt, versuchen Sie einfach zu prüfen, ob Sie ein console.log oder eine andere Anweisung ausführen können, mit der Sie sehen können, was gesendet und was empfangen wird.

Keven
quelle
1
Ich war das. Ich habe json irgendwo in meiner PHP-Datei wiedergegeben und in meiner Antwort PHP [// JSON-Daten] erhalten, aber ich konnte es nicht analysieren. Vielen Dank, dass Sie dies gepostet haben, damit ich meinen eigenen Fehler herausfinden kann.
Nicholas Decker
Das OP-Problem ist völlig anders. In Ihrem Fall versuchen Sie, HTML als JSON zu analysieren, und in den Fällen von OP versucht er, JSON als JavaScript zu analysieren.
Michał Perłakowski
7

Wenn Sie Ihre JSON-Datei anfordern, gibt der Server den JavaScript- Content-TypeHeader ( text/javascript) anstelle von JSON (application/json ) den ) zurück.

Laut MooTools docs :

Antworten mit Javascript-Inhaltstyp werden automatisch ausgewertet.

Im Ergebnis versucht MooTools, Ihren JSON als JavaScript zu bewerten, und wenn Sie versuchen, einen solchen JSON zu bewerten:

{"votes":47,"totalvotes":90}

Als JavaScript behandelt Parser {und }als Blockbereich anstelle der Objektnotation. Dies entspricht der Auswertung des folgenden "Codes":

"votes":47,"totalvotes":90

Wie Sie sehen können, :ist dort völlig unerwartet.

Die Lösung besteht darin, den richtigen Content-TypeHeader für die JSON-Datei festzulegen. Wenn Sie es mit der .jsonErweiterung speichern , sollte Ihr Server dies selbst tun.

Michał Perłakowski
quelle
4

Es hört sich so an, als würde Ihre Antwort irgendwie ausgewertet. Dies gibt den gleichen Fehler in Chrome:

var resp = '{"votes":47,"totalvotes":90}';
eval(resp);

Dies liegt daran, dass die geschweiften Klammern '{...}' von Javascript als Codeblock und nicht wie erwartet als Objektliteral interpretiert werden.

Ich würde mir die Funktion JSON.decode () ansehen und sehen, ob dort eine Bewertung vorhanden ist.

Ähnliches Problem hier: Eval () = Unerwartetes Token: Fehler

Zectbumo
quelle
2

Wenn nichts Sinn macht, kann dieser Fehler auch durch einen PHP-Fehler verursacht werden, der in HTML / Javascript eingebettet ist, wie der folgende

<br />
<b>Deprecated</b>:  mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in <b>C:\Projects\rwp\demo\en\super\ge.php</b> on line <b>54</b><br />
var zNodes =[{ id:1, pId:0, name:"ACE", url: "/ace1.php", target:"_self", open:true}

Nicht das <br />usw. im Code, das von PHP in HTML eingefügt wird, verursacht den Fehler . Verwenden Sie diesen Code zu Beginn, um diese Art von Fehler zu beheben (Warnung unterdrücken)

error_reporting(E_ERROR | E_PARSE);

Klicken Sie zum Anzeigen mit der rechten Maustaste auf die Seite "Quelle anzeigen" und überprüfen Sie das vollständige HTML, um diesen Fehler zu erkennen.

Hammad Khan
quelle
1

Fehler beim Auftreten von " Uncaught SyntaxError: Unexpected token ", wenn Ihre Daten ein falsches JSON-Format zurückgeben. In einigen Fällen wissen Sie nicht, dass Sie ein falsches JSON-Format haben.
Bitte überprüfen Sie es mit alert (); Funktion

onSuccess : function(resp){  
   alert(resp);  
}

Ihre empfangene Nachricht sollte lauten: {"Vorname": "John", "Nachname": "Doe"}
und dann können Sie den folgenden Code verwenden

onSuccess : function(resp){  
   var j = JSON.decode(resp); // but in my case i'm using: JSON.parse(resp); 
}

mit aus - Fehler „ Nicht abgefangene Syntaxerror: unerwartetes Token
aber wenn Sie falsch json - Format erhalten
ab:

... {"Vorname": "John", "Nachname": "Doe"}

oder

Undefined variable: errCapt in .... on line<b>65</b><br/>{"firstName":"John", "lastName":"Doe"}

Damit Sie ein falsches JSON-Format haben, beheben Sie es bitte, bevor Sie JSON.decode oder JSON.parse verwenden

Serip88
quelle
3
Ich empfehle die Verwendung console.log()anstelle von alert()zum Debuggen.
Michał Perłakowski
1

Das ist mir heute auch passiert. Ich habe EF verwendet und eine Entität als Antwort auf einen AJAX-Anruf zurückgegeben. Die virtuellen Eigenschaften meiner Entität verursachten einen zyklischen Abhängigkeitsfehler, der auf dem Server nicht erkannt wurde. Durch Hinzufügen des Attributs [ScriptIgnore] zu den virtuellen Eigenschaften wurde das Problem behoben.

Anstatt das ScriptIgnore-Attribut zu verwenden, ist es wahrscheinlich besser, nur ein DTO zurückzugeben.

Daryl
quelle
1

Dies geschah, weil ich auf meinem Express-Server eine Regel eingerichtet habe, um alle 404 zurück zu /#plus der ursprünglichen Anforderung weiterzuleiten. Ermöglichen, dass der Winkelrouter / js die Anforderung verarbeitet. Wenn es keine js-Route gibt, die diesen Pfad verarbeitet, wird eine Anforderung /#/whateveran den Server gesendet, die nur eine Anforderung für ist/ die gesamte Webseite handelt.

Wenn ich zum Beispiel eine Anfrage stellen wollte, diese /correct/somejsfile.jsaber nicht tippe, wird /wrong/somejsfile.jsdie Anfrage an den Server gesendet. Dieser Speicherort / diese Datei ist nicht vorhanden, daher antwortet der Server mit einem 302 location: /#/wrong/somejsfile.js. Der Browser folgt gerne der Weiterleitung und die gesamte Webseite wird zurückgegeben. Der Browser analysiert die Seite als js und Sie erhalten

Nicht erfasster SyntaxError: Unerwartetes Token <

Um den fehlerhaften Pfad / die fehlerhafte Anforderung zu finden, suchen Sie nach 302 Anforderungen.

Hoffe das hilft jemandem.

Jerinaw
quelle
1

Ich hatte das gleiche Problem und es stellte sich heraus, dass der vom Server zurückgegebene Json kein gültiger Json-P war. Wenn Sie den Anruf nicht als domänenübergreifenden Anruf verwenden, verwenden Sie regulären Json.

Jakob
quelle
OP verwendet JSON, nicht JSONP.
Michał Perłakowski
0

Ich habe ein " SyntaxError: Unexpected token I" erhalten, als ich jQuery.getJSON()versucht habe, einen Gleitkommawert von zu de-serialisieren Infinity, codiert als INF, was in JSON illegal ist.

Mark Cidade
quelle
1
Diese Frage bezieht sich auf "Unerwartetes Token : ".
Michał Perłakowski
0

In meinem Fall ist beim Ausführen der Spring-MVC-Anwendung derselbe Fehler aufgetreten, da die Zuordnung in meinem MVC-Controller falsch war

@RequestMapping(name="/private/updatestatus")

Ich habe die obige Zuordnung in geändert

 @RequestMapping("/private/updatestatus")

oder

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)
Shravan Ramamurthy
quelle
0

Für mich ging die Glühbirne an, als ich die Quelle auf der Seite im Chrome-Browser betrachtete. Ich hatte eine zusätzliche Klammer in einer if-Anweisung. Sie sehen sofort den roten Kreis mit einem Kreuz auf der fehlerhaften Linie. Dies ist eine eher wenig hilfreiche Fehlermeldung, da das Token "Nicht erfasster Syntaxfehler: Unerwartet" keinen Verweis auf eine Zeilennummer enthält, wenn es zum ersten Mal in der Konsole von Chrome angezeigt wird.

JGFMK
quelle
0

Ich habe das falsch gemacht

   `var  fs = require('fs');
    var fs.writeFileSync(file, configJSON);`

Ich habe die fsVariable bereits initialisiert. Aber ich habe wieder vardie zweite Zeile eingefügt. Diese gibt auch diese Art von Fehler ...

Jana
quelle
0

Für diejenigen, die dies in AngularJs 1.4.6 oder ähnlichem erlebten, bestand mein Problem darin, dass Angular meine Vorlage nicht fand, da die Datei unter dem von templateUrlmir angegebenen (Pfad) nicht gefunden werden konnte. Ich musste nur einen erreichbaren Weg angeben und das Problem ging weg.

lwdthe1
quelle
Ich löste das gleiche Problem, indem ich die Basis-URL korrigierte - zeigte auf den Stammordner => <base href = "/">
Abdeali Chandanwala
0

In meinem Fall war es eine fehlerhafte URL (nicht vorhanden), daher sollte Ihr "Senden" in der zweiten Zeile möglicherweise eine andere sein ...

Michal - wereda-net
quelle
0

Mein Fehler war, das einfache / doppelte Zitat zu vergessen um die URL in Javascript zu :

so falscher Code war:

window.location = https://google.com;

und korrekter Code:

window.location = "https://google.com";
Saeed Arianmanesh
quelle
-2

Nicht erfasster SyntaxError: Unerwartetes Token}

Chrome hat mir den Fehler für diesen Beispielcode gemeldet:

<div class="file-square" onclick="window.location = " ?dir=zzz">
    <div class="square-icon"></div>
    <div class="square-text">zzz</div>
</div>

und löste es, indem man den Klick so korrigierte, dass er so war

... onclick="window.location = '?dir=zzz'" ...

Aber der Fehler hat nichts mit dem Problem zu tun.

ungalcrys
quelle
OP fragte nach "Unerwartetes Token : ".
Michał Perłakowski