Nieprzechwycony Składnia Błąd: Nieoczekiwany token:


193

W moim skrypcie MooTools uruchamiam wywołanie AJAX, działa to dobrze w przeglądarce Firefox, ale w Chrome pojawia się Uncaught SyntaxError: Unexpected token :błąd, nie mogę ustalić przyczyny. Komentowanie kodu w celu ustalenia, gdzie znajduje się zły kod, nic nie daje, myślę, że może to być problem ze zwróconym JSON. Sprawdzam w konsoli, czy JSON zwrócił:

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

Nie widzę z tym żadnych problemów, dlaczego miałby wystąpić ten błąd?

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();
  });
});

1
JSON jest w porządku. Problem polega prawdopodobnie na tym, jak sobie z tym poradzisz. Pokazywanie kodu pomoże.
tcooc

1
Dodano część kodu do pytania.
trobrock

Wydaje się, że nie ma nic złego w składni, JS ani JSON. Pomocne byłoby opublikowanie (nie) działającej skrzynki testowej na jsfiddle.net - w tym HTML.
Oskar Krawczyk

1
Obecnie tetheringiem do Internetu, więc mój modem kompresuje źródło HTML stron internetowych, które przeglądam, więc tak naprawdę nie mogę zrobić kodu ani głów ani ogonów. Ale na początek umieść każdy kod JS w plikach zewnętrznych - to zawsze ułatwia debugowanie - będziesz wiedział, że pogoda jest spowodowana przez JS lub coś innego.
Oskar Krawczyk

2
„Nieoczekiwany token” to prawdopodobnie nielegalny kod znaku. Taki kod prawdopodobnie nie pojawi się podczas drukowania na konsoli. Dlatego wydrukuj ciąg po jednym znaku na raz lub użyj analizatora protokołu lub debuggera itp., Aby zobaczyć rzeczywiste bajty ciągu.
GroovyDotCom

Odpowiedzi:


93

Widzę czerwone błędy

Uncaught SyntaxError: Nieoczekiwany token <

na karcie konsoli programisty Chrome jest wskazanie HTML w treści odpowiedzi.

To, co tak naprawdę widzisz, to reakcja przeglądarki na nieoczekiwany górny wiersz <!DOCTYPE html>z serwera.


4
Nie mam pojęcia, dlaczego mówisz o „Nieoczekiwanym tokenie <”, gdy chodzi o pytanie Unexpected token :. Twoja odpowiedź jest całkowicie niezwiązana z problemem OP.
Michał Perłakowski

1
I jak to naprawić? Mam przekierowanie php, które powoduje to w Chrome.
Działa dla żywego

7
Aby dodać do @andy_magoon, w moim przypadku miałem tag skryptu, który miał obsługiwać javascript, ale ponieważ żądanie zostało przekierowane na stronę HTML (nie jest ważne, dlaczego zostało przekierowane), który zaczyna się od <! ​​DOCTYPE html >, który nie jest prawidłowym skryptem javascript, przeglądarka zwraca błąd SyntaxError, gdy próbuje parsować HTML jako JS.
david.barkhuizen

2
@Thom Aby to naprawić, upewnij się, że HTTP get zwróci plik javascript, którego szukasz, a nie nieoczekiwany HTML.
david.barkhuizen

1
Dostałem dokładnie ten błąd, ponieważ, jak się okazuje, ścieżka do pliku jest niepoprawna i nie może znaleźć pliku określonego w znaczniku skryptu.
newman

80

Tylko FYI dla osób, które mogą mieć ten sam problem - musiałem tylko zmusić mój serwer do odesłania JSON, ponieważ aplikacja / json i domyślny moduł obsługi jQuery działały dobrze.


4
Myślę, że mam odwrotność tego problemu. Proszę JSON z interfejsu API innej firmy, a oni zwracają aplikację / javascript jako odpowiedź i otrzymuję ten sam błąd, który zgłosiłeś w tym pytaniu. Nie jestem pewien, jak sobie z tym poradzić.
wuliwong

5
Dziwny problem - działa dobrze na localhost, ale nie na serwerze. Masz pomysł, dlaczego?
VishwaKumar

Dzień dobry. Mam dokładny problem i nie mogę go rozwiązać, czy ktoś może mi powiedzieć, jak odesłać JSON z powrotem do serwera
Alen,

Dzięki, wysyłałem aplikację / javascript (ponieważ źle odczytałem to SO ) i otrzymywałem ten błąd na prostym, prawidłowym JSON. Zmiana w celu application/jsonrozwiązania błędu. Nie używam JSONP.
scipilot

Nawet otrzymuję ten sam błąd „Nieprzechwycony błąd składni: nieoczekiwany token:”, nawet po otrzymaniu odpowiedzi w formacie json {„sukces”: prawda, „dane”: 2593}
Rupali Pemare

41

Tak mi się właśnie stało, a powodem nie był żaden z powyższych powodów. Korzystałem z komendy jQuery callback=?getJSON i dodawałem, aby używać JSONP (ponieważ potrzebowałem przejść między domenami), zwracałem kod JSON {"foo":"bar"}i otrzymywałem błąd.

Wynika to z faktu, że powinienem dołączyć dane wywołania zwrotnego, coś w rodzaju jQuery17209314005577471107_1335958194322({"foo":"bar"})

Oto kod PHP, którego użyłem, aby to osiągnąć, co zmniejsza się, jeśli użyje się JSON (bez wywołania zwrotnego):

$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; 
}

Mam nadzieję, że to pomoże komuś w przyszłości.


Bardzo mi pomogło. Dane json powinniśmy zawijać danymi jsoncallback za każdym razem, gdy używamy metody jsonp. Również dane jsonpcallback nie powinny zaczynać się cyframi. Kiedy próbowałem z liczbami, to nie wyszło. Kiedy spróbowałem z tym samym formatem pokazanym w tej odpowiedzi, zadziałało ...
Ganesh Babu,

To prawda, ale błąd jest taki sam, a kod ulegnie degradacji z wdziękiem i nadal będzie działać, jeśli używany jest JSON.
Ponury ...

Działa to dla mnie z AJAX, jQuery i JSONP. Wielkie dzięki!
Piotr Wittchen

16

Właśnie rozwiązałem problem. Coś powodowało problemy ze standardowym wywołaniem żądania, więc użyłem tego kodu:

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);
  });
});

Jeśli ktoś wie, dlaczego standardowy obiekt Request powodował problemy, chciałbym wiedzieć.


3
różnica między standardowym żądaniem a żądaniem.json jest głównie w nagłówkach, dodaje this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- idź
Dimitar Christoff

Dziwne, że to właśnie powodowało problem z tym.
trobrock

3
Jakie są podwójne $$?
falsarella

@DimitarChristoff - jakaś odpowiedź dla falsarelli na temat $$?
znieść

1
@bear Selektor podwójnego dolara jest zdefiniowany w MooTools.
Anthony Faull

10

Pomyślałem, że dodam mój problem i rozwiązanie do listy.

Otrzymywałem: Uncaught SyntaxError: Unexpected token <i błąd wskazywał na ten wiersz w moim oświadczeniu powodzenia ajax:

var total = $.parseJSON(response);

Później dowiedziałem się, że oprócz wyników JSON-a wysłano HTML z odpowiedzią, ponieważ miałem błąd w moim PHP. Kiedy pojawia się błąd w PHP, możesz ustawić go tak, aby ostrzegał cię przed ogromnymi pomarańczowymi tabelami, a te tabele były tym, co rzucało JSON.

Dowiedziałem się tego, po prostu robiąc console.log(response), aby zobaczyć, co faktycznie zostało wysłane. Jeśli jest to problem z danymi JSON, po prostu spróbuj sprawdzić, czy możesz zrobić plik console.log lub inną instrukcję, która pozwoli ci zobaczyć, co jest wysyłane i co odbierane.


1
Ja to zrobiłem. Powtarzałem echo jsona gdzieś w moim pliku php i otrzymywałem php [// json data] w mojej odpowiedzi, ale nie byłem w stanie go przeanalizować. Dzięki za opublikowanie tego, żebym mógł wymyślić swój własny błąd.
Nicholas Decker

Problem OP jest zupełnie inny. W twoim przypadku próbujesz parsować HTML jako JSON, aw przypadku OP próbuje on parsować JSON jako JavaScript.
Michał Perłakowski

7

Gdy zażądasz pliku JSON, serwer zwraca JavaScript Content-Typeheader ( text/javascript) zamiast JSON ( application/json).

Według dokumentów MooTools :

Odpowiedzi na treść typu javascript będą oceniane automatycznie.

W rezultacie MooTools próbuje ocenić twój JSON jako JavaScript, a kiedy próbujesz ocenić taki JSON:

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

jako JavaScript, parser traktuje {i }jako zakres blokowy zamiast notacji obiektowej. Jest to to samo, co ocena następującego „kodu”:

"votes":47,"totalvotes":90

Jak widać, :jest całkowicie nieoczekiwany.

Rozwiązaniem jest ustawienie poprawnego Content-Typenagłówka dla pliku JSON. Jeśli zapiszesz go z .jsonrozszerzeniem, twój serwer powinien zrobić to sam.


4

Wygląda na to, że Twoja odpowiedź jest w jakiś sposób oceniana. Daje to ten sam błąd w Chrome:

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

Wynika to z interpretacji nawiasów klamrowych {{}} przez javascript jako bloku kodu, a nie literału obiektu, jak można się spodziewać.

Chciałbym spojrzeć na funkcję JSON.decode () i sprawdzić, czy jest tam eval.

Podobny problem tutaj: Eval () = Nieoczekiwany token: błąd


2

Jeśli nic nie ma sensu, ten błąd może być również spowodowany błędem PHP osadzonym w html / javascript, takim jak ten poniżej

<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}

Nie <br />etc w kodzie, który jest wstawiany do HTML przez PHP . Aby naprawić tego rodzaju błąd (pomiń ostrzeżenie), użyj tego kodu na początku

error_reporting(E_ERROR | E_PARSE);

Aby wyświetlić, kliknij prawym przyciskiem myszy stronę, „wyświetl źródło”, a następnie sprawdź pełny kod HTML, aby wykryć ten błąd.


1

Błąd „ Uncaught SyntaxError: Nieoczekiwany token ” pojawia się, gdy dane zwracają niewłaściwy format JSON, w niektórych przypadkach nie wiesz, że masz zły format JSON.
sprawdź to za pomocą alert (); funkcjonować

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

Twoja wiadomość powinna otrzymać: {„firstName”: „John”, „lastName”: „Doe”},
a następnie możesz użyć kodu poniżej

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

bez błędu „ Nieprzechwycony błąd składni: nieoczekiwany token ”,
ale jeśli wystąpi zły format json
np .:

... {„firstName”: „John”, „lastName”: „Doe”}

lub

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

abyś miał zły format JSON, popraw go przed JSON.decode lub JSON.parse


3
Polecam używać console.log()zamiast alert()do debugowania.
Michał Perłakowski

1

To zdarzyło mi się również dzisiaj. Używałem EF i zwracałem Encję w odpowiedzi na wywołanie AJAX. Wirtualne właściwości mojej jednostki powodowały cykliczny błąd zależności, który nie został wykryty na serwerze. Dodanie atrybutu [ScriptIgnore] do właściwości wirtualnych rozwiązało problem.

Zamiast używać atrybutu ScriptIgnore, prawdopodobnie lepiej byłoby po prostu zwrócić DTO.


1

Stało się tak, ponieważ mam konfigurację reguł na moim serwerze ekspresowym, aby kierować dowolne 404 z powrotem na /#plus niezależnie od tego, jakie było pierwotne żądanie. Zezwolenie routerowi kątowemu / js na obsługę żądania. Jeśli nie ma trasy js do obsługi tej ścieżki, wysyłane jest żądanie do /#/whateverserwera, które jest tylko żądaniem dla /całej strony.

Na przykład, jeśli chciałbym złożyć wniosek, /correct/somejsfile.jsale nie napisałem go, aby /wrong/somejsfile.jsżądanie zostało przesłane do serwera. Ta lokalizacja / plik nie istnieje, więc serwer odpowiada za pomocą 302 location: /#/wrong/somejsfile.js. Przeglądarka z radością podąża za przekierowaniem i cała strona jest zwracana. Przeglądarka analizuje stronę jako js i dostajesz

Uncaught SyntaxError: Nieoczekiwany token <

Aby więc znaleźć szkodliwą ścieżkę / żądanie, poszukaj 302 żądań.

Mam nadzieję, że komuś pomoże.


1

Miałem ten sam problem i okazało się, że Json wrócił z serwera nie był prawidłowy Json-P. Jeśli nie używasz połączenia jako połączenia między domenami, użyj zwykłego Jsona.


OP używa JSON, a nie JSONP.
Michał Perłakowski

0

Dostałem „ SyntaxError: Unexpected token I”, gdy jQuery.getJSON()próbowałem zserializować wartość zmiennoprzecinkową Infinity, zakodowaną jako INF, co jest nielegalne w JSON.


1
To pytanie dotyczy „Nieoczekiwanego tokena : ”.
Michał Perłakowski

0

W moim przypadku napotkałem ten sam błąd podczas uruchamiania wiosennej aplikacji mvc z powodu nieprawidłowego mapowania w moim kontrolerze mvc

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

zmieniłem powyższe mapowanie na

 @RequestMapping("/private/updatestatus")

lub

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)

0

Dla mnie żarówka zapaliła się, gdy zobaczyłem źródło strony w przeglądarce Chrome. Miałem dodatkowy nawias w instrukcji if. Od razu zobaczysz czerwone kółko z krzyżem na linii, która nie działa. Jest to raczej nieprzydatny komunikat o błędzie, ponieważ błąd nieprzechwyconej składni: nieoczekiwany token nie odwołuje się do numeru linii, gdy pojawia się po raz pierwszy w konsoli Chrome.


0

Zrobiłem w tym źle

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

Już zainicjalizowałem fszmienną, ale ponownie wstawiłem vardrugą linię, która również daje taki błąd ...


0

Dla osób, które doświadczają tego w AngularJs 1.4.6 lub podobnym, moim problemem było to, że Angular nie znalazł mojego szablonu, ponieważ nie mogłem znaleźć pliku w templateUrl(ścieżce), który podałem. Musiałem tylko zapewnić dostępną ścieżkę i problem zniknął.


rozwiązałem ten sam problem, poprawiając adres URL baseref - wskazałem na folder główny => <base href = "/">
Abdeali Chandanwala

0

W moim przypadku był to błędny adres URL (nieistniejący), więc może twoje „wyślij” w drugiej linii powinno być inne ...


0

Moim błędem było zapomnienie o pojedynczym / podwójnym cytacie wokół adresu URL w javascript:

więc zły kod to:

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

i poprawny kod:

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

-2

Uncaught SyntaxError: Nieoczekiwany token}

Chrome dał mi błąd dla tego przykładowego kodu:

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

i rozwiązałem to, naprawiając kliknięcie

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

Ale błąd nie ma nic wspólnego z problemem.


OP zapytał o „Nieoczekiwany token : ”.
Michał Perłakowski
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.