Sintassi non rilevata Errore: token imprevisto:


193

Sto eseguendo una chiamata AJAX nel mio script MooTools, funziona bene in Firefox ma in Chrome sto ricevendo un Uncaught SyntaxError: Unexpected token :errore, non riesco a determinare il perché. Commentare il codice per determinare dove si trova il codice errato non produce nulla, sto pensando che potrebbe essere un problema con la restituzione di JSON. Controllando nella console vedo che il JSON restituito è questo:

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

Non vedo alcun problema, perché dovrebbe verificarsi questo errore?

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
Il JSON sta bene. Il problema è probabilmente come lo gestisci. Mostrare il codice ti aiuterà.
tcooc

1
Aggiunta la parte di codice alla domanda.
trobrock,

Non sembra esserci nulla di sbagliato nella sintassi, JS né JSON. Pubblicare un test case (non) funzionante su jsfiddle.net sarebbe di aiuto, incluso HTML.
Oskar Krawczyk,

1
Attualmente sto collegando Internet in modo che il mio modem comprima l'origine HTML dei siti Web che navigo, quindi non riesco davvero a ricavare codici o code dal codice. Ma, per cominciare, metti ogni codice JS in file esterni - questo semplifica sempre il debug - saprai che tempo è causato dall'errore JS o qualcos'altro.
Oskar Krawczyk,

2
Un "token imprevisto" è probabilmente un codice carattere non valido. È probabile che tale codice non venga visualizzato quando si stampa sulla console. Pertanto, stampare la stringa di un carattere alla volta o utilizzare un analizzatore di protocollo o un debugger ecc. Per visualizzare i byte effettivi della stringa.
GroovyDotCom

Risposte:


94

Vedere errori rossi

Uncaught SyntaxError: token imprevisto <

nella scheda della console di sviluppo di Chrome è presente un'indicazione di HTML nel corpo della risposta.

Quello che stai effettivamente vedendo è la reazione del tuo browser alla linea superiore inaspettata <!DOCTYPE html>dal server.


4
Non ho idea del motivo per cui stai parlando di "Token inatteso <" quando si tratta di una domanda Unexpected token :. La tua risposta è completamente estranea al problema di OP.
Michał Perłakowski,

1
E come posso risolvere questo problema? Ho un reindirizzamento php che sta causando questo in Chrome.
Funziona per un Living

7
Per aggiungere a @andy_magoon, nel mio caso, avevo un tag di script che avrebbe dovuto servire javascript, ma perché la richiesta è stata reindirizzata a una pagina HTML (non è importante il motivo per cui è stato reindirizzato), che inizia con <! DOCTYPE html >, che non è JavaScript valido, il browser restituisce SyntaxError quando tenta di analizzare l'HTML come JS.
david.barkhuizen,

2
@Thom Il modo per risolverlo è assicurarsi che HTTP get restituisca il file javascript che stai cercando e non HTML imprevisto.
david.barkhuizen,

1
Ho riscontrato esattamente questo errore perché, a quanto pare, il percorso del file non è corretto e non riesce a trovare il file specificato nel tag script.
Newman,

80

Solo una FYI per le persone che potrebbero avere lo stesso problema: ho dovuto solo fare in modo che il mio server rispedisse il JSON come application / json e il gestore jQuery predefinito funzionava bene.


4
Penso di avere l'inverso di questo problema. Sto richiedendo JSON da un'API di terze parti e stanno restituendo application / javascript come risposta e sto ricevendo lo stesso errore che hai segnalato in questa domanda. Non sono sicuro di come gestirlo.
wuliwong,

5
Uno strano problema è: funziona bene sull'host locale ma non sul server. Qualche idea sul perché?
VishwaKumar,

Ciao. Ho il problema esatto e non riesco a risolverlo, qualcuno può dirmi come si rimanda JSON al server
Alen,

Grazie, stavo inviando application / javascript (dato che ho letto male questo SO ) e stavo ottenendo questo errore su un semplice JSON valido. Modificandolo per application/jsonrisolvere l'errore. Non sto usando JSONP.
Scipilot,

Anche io ricevo lo stesso errore "Uncaught SyntaxError: token imprevisto:", anche dopo aver ricevuto la risposta in formato json {"successo": vero, "dati": 2593}
Rupali Pemare

41

Questo mi è appena successo e la ragione non era nessuna delle ragioni sopra. Stavo usando il comando jQuery getJSON e aggiungevo callback=?per usare JSONP (di cui avevo bisogno per passare tra domini) e restituivo il codice JSON{"foo":"bar"} e ottenevo l'errore.

Questo perché avrei dovuto includere i dati di callback, qualcosa del genere jQuery17209314005577471107_1335958194322({"foo":"bar"})

Ecco il codice PHP che ho usato per raggiungere questo obiettivo, che degrada se viene utilizzato JSON (senza callback):

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

Spero che possa aiutare qualcuno in futuro.


Mi ha aiutato molto. Dovremmo racchiudere i dati json con i dati jsoncallback ogni volta che utilizziamo il metodo jsonp. Inoltre, i dati jsonpcallback non devono iniziare con i numeri. Quando ho provato con i numeri, non ha funzionato. Quando l'ho provato con lo stesso formato mostrato in questa risposta, ha funzionato ...
Ganesh Babu,

Abbastanza vero, ma l'errore è lo stesso e il codice si degraderà con grazia e continuerà a funzionare se viene utilizzato JSON.
Triste ...

Questo ha funzionato per me con AJAX, jQuery e JSONP. Molte grazie!
Piotr Wittchen

16

Ho appena risolto il problema. C'era qualcosa che causava problemi con una chiamata di richiesta standard, quindi questo è il codice che ho usato invece:

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

Se qualcuno sa perché l'oggetto Request standard mi stava dando problemi, mi piacerebbe saperlo.


3
la differenza tra richiesta standard e request.json è principalmente nelle intestazioni, aggiunge this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- vai a capire
Dimitar Christoff

Strano che questo è ciò che stava causando il problema con questo.
trobrock

3
Quali sono i doppi $$lì?
falsarella,

@DimitarChristoff: qualsiasi risposta per falsarella sul $$?
orso

1
@bear Il selettore doppio dollaro è definito in MooTools.
Anthony Faull,

10

Ho pensato di aggiungere il mio problema e la mia risoluzione all'elenco.

Stavo ottenendo: Uncaught SyntaxError: Unexpected token <e l'errore indicava questa riga nella mia dichiarazione di successo ajax:

var total = $.parseJSON(response);

In seguito ho scoperto che oltre ai risultati json, era stato inviato HTML con la risposta perché avevo un errore nel mio PHP. Quando ricevi un errore in PHP puoi impostarlo per avvisarti con enormi tavoli arancioni e quei tavoli erano ciò che stava gettando via il JSON.

L'ho scoperto semplicemente facendo un console.log(response)per vedere cosa veniva effettivamente inviato. Se si tratta di un problema con i dati JSON, prova a vedere se riesci a fare un console.log o qualche altra istruzione che ti permetterà di vedere cosa viene inviato e cosa viene ricevuto.


1
L'ho fatto. Stavo facendo eco a json da qualche parte nel mio file php e stavo ottenendo php [// dati json] nella mia risposta, ma non ero in grado di analizzarlo. Grazie per aver pubblicato questo in modo da poter capire il mio errore.
Nicholas Decker,

Il problema OP è completamente diverso. Nel tuo caso stai cercando di analizzare HTML come JSON, e nel caso di OP sta cercando di analizzare JSON come JavaScript.
Michał Perłakowski,

7

Quando richiedi il tuo file JSON, il server restituisce l' Content-Typeintestazione JavaScript ( text/javascript) anziché JSON (application/json ).

Secondo i documenti di MooTools :

Le risposte con tipo di contenuto javascript verranno valutate automaticamente.

Di conseguenza MooTools prova a valutare JSON come JavaScript e quando si tenta di valutare tale JSON:

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

come JavaScript, il parser tratta {e }come un ambito di blocco invece della notazione dell'oggetto. È lo stesso che valutare il seguente "codice":

"votes":47,"totalvotes":90

Come potete vedere, : è totalmente inaspettato lì.

La soluzione è impostare l' Content-Typeintestazione corretta per il file JSON. Se lo salvi con l' .jsonestensione, il tuo server dovrebbe farlo da solo.


4

Sembra che la tua risposta venga valutata in qualche modo. Questo dà lo stesso errore in Chrome:

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

Ciò è dovuto al fatto che le parentesi graffe "{...}" vengono interpretate da JavaScript come un blocco di codice e non come un oggetto letterale come ci si potrebbe aspettare.

Vorrei guardare la funzione JSON.decode () e vedere se c'è un eval in là.

Problema simile qui: Eval () = Token imprevisto: errore


2

Se nulla ha senso, questo errore può anche essere causato dall'errore PHP incorporato in html / javascript, come quello qui sotto

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

Non <br />ecc. Nel codice che sono stati inseriti in HTML da PHP sta causando l'errore . Per correggere questo tipo di errore (sopprimere l'avviso), utilizzare questo codice all'inizio

error_reporting(E_ERROR | E_PARSE);

Per visualizzare, fare clic con il tasto destro sulla pagina, "visualizza sorgente" e quindi esaminare HTML completo per individuare questo errore.


1

Aspetto dell'errore " Uncaught SyntaxError: token imprevisto " quando i tuoi dati restituiscono un formato json errato, in alcuni casi, non sai di avere un formato json sbagliato.
si prega di controllare con alert (); funzione

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

il tuo messaggio ricevuto dovrebbe essere: {"firstName": "John", "lastName": "Doe"}
e quindi puoi usare il codice qui sotto

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

senza errore " Uncaught SyntaxError: token imprevisto "
ma se si ottiene un formato json errato
es:

... {"firstName": "John", "lastName": "Doe"}

o

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

in modo da avere un formato json errato, correggilo prima di JSON.decode o JSON.parse


3
Consiglio di utilizzare console.log()invece che alert()per il debug.
Michał Perłakowski,

1

Questo è successo anche a me oggi. Stavo usando EF e restituivo un'entità in risposta a una chiamata AJAX. Le proprietà virtuali sulla mia entità stavano causando un errore di dipendenza ciclica che non veniva rilevato sul server. Aggiungendo l'attributo [ScriptIgnore] alle proprietà virtuali, il problema è stato risolto.

Invece di utilizzare l'attributo ScriptIgnore, sarebbe probabilmente meglio restituire un DTO.


1

Questo è successo perché ho una configurazione di regole nel mio server express per instradare qualsiasi 404 indietro a /#più qualunque fosse la richiesta originale. Consentire al router / j angolare di gestire la richiesta. Se non esiste alcun percorso js per gestire quel percorso, viene inviata una richiesta al /#/whateverserver, che è solo una richiesta per/ , l'intera pagina web.

Quindi, ad esempio, se volevo fare una richiesta, /correct/somejsfile.jsma mi mancava di digitarla, /wrong/somejsfile.jsla richiesta viene inviata al server. Quel percorso / file non esiste, quindi il server risponde con a 302 location: /#/wrong/somejsfile.js. Il browser segue felicemente il reindirizzamento e viene restituita l'intera pagina Web. Il browser analizza la pagina come js e ottieni

Uncaught SyntaxError: token imprevisto <

Quindi, per aiutarti a trovare il percorso / richiesta offensivo, cerca 302 richieste.

Spero che aiuti qualcuno.


1

Ho avuto lo stesso problema e si è scoperto che il Json restituito dal server non era valido Json-P. Se non si utilizza la chiamata come chiamata crossdomain, utilizzare Json normale.


OP utilizza JSON, non JSONP.
Michał Perłakowski,

0

Ho ottenuto un " SyntaxError: Unexpected token I" quando cercavo jQuery.getJSON()di deserializzare un valore in virgola mobile di Infinity, codificato come INF, che è illegale in JSON.


1
Questa domanda riguarda "Token imprevisto : ".
Michał Perłakowski,

0

Nel mio caso mi sono imbattuto nello stesso errore, mentre eseguivo l'applicazione mvc a molla a causa di una mappatura errata nel mio controller mvc

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

ho cambiato la mappatura sopra in

 @RequestMapping("/private/updatestatus")

o

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

0

Per me la lampadina si è accesa quando ho visualizzato la fonte sulla pagina all'interno del browser Chrome. Ho avuto una parentesi extra in un'istruzione if. Vedrai immediatamente il cerchio rosso con una croce sulla linea mancante. È un messaggio di errore piuttosto inutile, perché l'errore Untaught Syntax Error: Unexpected non fa riferimento a un numero di riga quando appare per la prima volta nella console di Chrome.


0

Ho sbagliato in questo

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

Ho già inizializzato la fsvariabile, ma di nuovo ho inserito varla seconda riga, che dà anche quel tipo di errore ...


0

Per coloro che hanno riscontrato questo problema in AngularJs 1.4.6 o simili, il mio problema era che Angular non trovava il mio modello perché il file sul templateUrl(percorso) fornito non è stato trovato. Dovevo solo fornire un percorso raggiungibile e il problema è scomparso.


ho risolto lo stesso problema correggendo l'URL di base - indicava la cartella principale => <base href = "/">
Abdeali Chandanwala,

0

Nel mio caso è stato un url errato (non esistente), quindi forse il tuo 'invio' in seconda riga dovrebbe essere altro ...


0

Il mio errore era dimenticare la citazione singola / doppia url in javascript:

quindi il codice sbagliato era:

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

e codice corretto :

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

-2

Sintassi non rilevata Errore: token imprevisto}

Chrome mi ha dato l'errore per questo codice di esempio:

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

e risolto riparando l'onclick per essere come

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

Ma l'errore non ha nulla a che fare con il problema.


OP ha chiesto "Token imprevisto : ".
Michał Perłakowski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.