SyntaxError no detectada: fichas inesperado :

193

Estoy ejecutando una llamada AJAX en mi script MooTools, esto funciona bien en Firefox pero en Chrome recibo un Uncaught SyntaxError: Unexpected token :error, no puedo determinar por qué. Al comentar el código para determinar dónde está el código incorrecto no se obtiene nada, creo que puede ser un problema que se devuelva el JSON. Al comprobar en la consola, veo que el JSON devuelto es este:

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

No veo ningún problema con él, ¿por qué ocurriría este error?

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
fuente
1
El JSON está bien. El problema es probablemente cómo lo manejas. Mostrar el código ayudará.
tcooc
1
Se agregó la porción de código a la pregunta.
trobrock
No parece haber nada malo con la sintaxis, el JS ni el JSON. Publicar un (no) caso de prueba que funcione en jsfiddle.net ayudaría, incluido HTML.
Oskar Krawczyk
1
Actualmente estoy conectando Internet para que mi módem comprima la fuente HTML de los sitios web que navego, por lo que realmente no puedo sacar cara o cruz del código. Pero, para empezar, coloque todos los códigos JS en archivos externos, esto siempre facilita la depuración, sabrá si el error es causado por JS u otra cosa.
Oskar Krawczyk
2
Es probable que un "token inesperado" sea un código de caracteres ilegal. Es probable que dicho código no aparezca cuando imprime en la consola. Por lo tanto, imprima la cadena un carácter a la vez o use un analizador de protocolo o depurador, etc. para ver los bytes reales de la cadena.
GroovyDotCom

Respuestas:

93

Ver errores rojos

SyntaxError no capturado: token inesperado <

en la pestaña de la consola del desarrollador de Chrome hay una indicación de HTML en el cuerpo de la respuesta.

Lo que realmente está viendo es la reacción de su navegador a la inesperada línea superior <!DOCTYPE html>del servidor.

Andy Magoon
fuente
44
No tengo idea de por qué estás hablando de "token inesperado <" cuando se trata de una pregunta Unexpected token :. Su respuesta no tiene relación alguna con el problema de OP.
Michał Perłakowski
1
¿Y cómo soluciono esto? Tengo una redirección de PHP que está causando esto en Chrome.
Trabaja para
77
Para agregar a @andy_magoon, en mi caso, tenía una etiqueta de script que se suponía que debía servir javascript, pero debido a que la solicitud fue redirigida a una página HTML (no es importante por qué fue redirigida), que comienza con <! DOCTYPE html >, que no es javascript válido, el navegador devuelve SyntaxError cuando intenta analizar el HTML como JS.
david.barkhuizen
2
@Thom La forma de solucionarlo es asegurarse de que HTTP get devuelve el archivo javascript que está buscando y no HTML inesperado.
david.barkhuizen
1
Obtuve exactamente este error porque, como resultado, la ruta del archivo es incorrecta y no puede encontrar el archivo especificado en la etiqueta del script.
newman
80

Solo un FYI para las personas que podrían tener el mismo problema: solo tuve que hacer que mi servidor enviara el JSON como application / json y el controlador predeterminado jQuery funcionó bien.

Edward Abrams
fuente
44
Creo que estoy teniendo el inverso de este problema. Estoy solicitando JSON de una API de terceros y están devolviendo la aplicación / javascript como respuesta y recibo el mismo error que informaron en esta pregunta. No estoy seguro de cómo lidiar con eso.
wuliwong
55
Un problema extraño es que funciona bien en el host local pero no en el servidor. ¿Alguna idea de por qué?
VishwaKumar
Hola. Tengo un problema exacto y no puedo resolverlo, ¿alguien puede decirme cómo envías a JSON al servidor?
Alen
Gracias, estaba enviando aplicación / javascript (ya que leí mal este SO ) y recibí este error en un JSON válido simple. Cambiándolo para application/jsonresolver el error. No estoy usando JSONP.
scipilot
Incluso recibo el mismo error "Error de sintaxis no detectado: token inesperado", incluso después de recibir la respuesta en formato json {"éxito": verdadero, "datos": 2593}
Rupali Pemare
41

Esto me acaba de pasar, y el motivo no fue ninguno de los anteriores. Estaba usando el comando jQuery getJSON y agregué callback=?para usar JSONP (ya que necesitaba ir entre dominios), y devolví el código JSON{"foo":"bar"} y obtuve el error.

Esto se debe a que debería haber incluido los datos de devolución de llamada, algo así como jQuery17209314005577471107_1335958194322({"foo":"bar"})

Aquí está el código PHP que usé para lograr esto, que se degrada si se usa JSON (sin devolución de llamada):

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

Esperemos que eso ayude a alguien en el futuro.

Severo...
fuente
Me ayudó mucho. Deberíamos ajustar los datos de json con los datos de jsoncallback cuando estemos usando el método jsonp Además, los datos de jsonpcallback no deberían comenzar con números. Cuando probé con números, no funcionó. Cuando lo probé con el mismo formato que se muestra en esta respuesta, funcionó ...
Ganesh Babu
Es cierto, pero el error es el mismo y el código se degradará con gracia y seguirá funcionando si se está utilizando JSON.
Grim ...
Esto funcionó para mí con AJAX, jQuery y JSONP. ¡Muchas gracias!
Piotr Wittchen
16

Acabo de resolver el problema. Hubo algo que causó problemas con una llamada de solicitud estándar, por lo que este es el código que usé en su lugar:

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

Si alguien sabe por qué el objeto Solicitud estándar me estaba dando problemas, me encantaría saberlo.

trobrock
fuente
3
la diferencia entre la solicitud estándar y request.json se encuentra principalmente en los encabezados, agrega this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- vaya a la figura
Dimitar Christoff el
Extraño que eso es lo que estaba causando el problema con esto.
trobrock 01 de
3
¿Cuáles son los dobles $$allí?
falsarella
@DimitarChristoff: ¿alguna respuesta para falsarella sobre $$?
oso
1
@bear El selector de doble dólar se define en MooTools.
Anthony Faull
10

Pensé en agregar mi problema y resolución a la lista.

Estuve obteniendo: Uncaught SyntaxError: Unexpected token < y el error apuntaba a esta línea en mi declaración de éxito de ajax:

var total = $.parseJSON(response);

Más tarde descubrí que, además de los resultados de json, se enviaba HTML con la respuesta porque tenía un error en mi PHP. Cuando obtiene un error en PHP, puede configurarlo para que le advierta con enormes tablas naranjas y esas tablas fueron lo que arrojó el JSON.

Lo descubrí simplemente haciendo un console.log(response)para ver lo que realmente se estaba enviando. Si se trata de un problema con los datos JSON, solo intente ver si puede hacer un console.log o alguna otra declaración que le permita ver lo que se envía y lo que se recibe.

Keven
fuente
1
Hice esto. Estaba haciendo eco de json en algún lugar de mi archivo php y recibía php [// datos json] en mi respuesta, pero no pude analizarlo. Gracias por publicar esto para poder resolver mi propio error.
Nicholas Decker
El problema de OP es completamente diferente. En su caso, está tratando de analizar HTML como JSON, y en el caso de OP, está intentando analizar JSON como JavaScript.
Michał Perłakowski
7

Cuando solicita su archivo JSON, el servidor devuelve el Content-Typeencabezado JavaScript ( text/javascript) en lugar de JSON ( application/json).

Según los documentos de MooTools :

Las respuestas con javascript content-type se evaluarán automáticamente.

En consecuencia, MooTools intenta evaluar su JSON como JavaScript, y cuando intenta evaluar dicho JSON:

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

como JavaScript, el analizador trata {y }como un ámbito de bloque en lugar de notación de objeto. Es lo mismo que evaluar el siguiente "código":

"votes":47,"totalvotes":90

Como puede ver, :es totalmente inesperado allí.

La solución es establecer el Content-Typeencabezado correcto para el archivo JSON. Si lo guarda con .jsonextensión, su servidor debería hacerlo solo.

Michał Perłakowski
fuente
4

Parece que su respuesta se está evaluando de alguna manera. Esto da el mismo error en Chrome:

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

Esto se debe a que las llaves '{...}' están siendo interpretadas por javascript como un bloque de código y no como un objeto literal como cabría esperar.

Vería la función JSON.decode () y vería si hay una evaluación allí.

Problema similar aquí: Eval () = token inesperado: error

Zectbumo
fuente
2

Si nada tiene sentido, este error también puede ser causado por un error PHP que está incrustado dentro de html / javascript, como el siguiente

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

No el <br />etc. en el código que PHP inserta en html está causando el error . Para corregir este tipo de error (suprimir advertencia), usé este código al comienzo

error_reporting(E_ERROR | E_PARSE);

Para ver, haga clic derecho en la página, "ver código fuente" y luego examine html completo para detectar este error.

Hammad Khan
fuente
1

" No detectada SyntaxError: inesperado símbolo " apariencia de error cuando los datos vuelven formato JSON mal, en algún caso, no se sabe que tiene formato JSON mal.
por favor verifíquelo con alert (); función

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

su mensaje recibido debe ser: {"firstName": "John", "lastName": "Doe"}
y luego puede usar el código a continuación

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

sin error "Error de sintaxis no detectado: token inesperado ",
pero si obtiene un formato json incorrecto, por
ejemplo:

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

o

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

para que tenga un formato json incorrecto, corríjalo antes de codificar JSON.de o JSON.parse

Serip88
fuente
3
Recomiendo usar en console.log()lugar de alert()para la depuración.
Michał Perłakowski
1

Esto me pasó a mí hoy también. Estaba usando EF y devolvía una entidad en respuesta a una llamada AJAX. Las propiedades virtuales en mi entidad estaban causando un error de dependencia cíclico que no se detectaba en el servidor. Al agregar el atributo [ScriptIgnore] en las propiedades virtuales, se solucionó el problema.

En lugar de usar el atributo ScriptIgnore, probablemente sería mejor devolver un DTO.

Daryl
fuente
1

Esto sucedió porque tengo una configuración de regla en mi servidor express para enrutar cualquier 404 a /#más cualquiera que sea la solicitud original. Permitir que el enrutador angular / js maneje la solicitud. Si no hay una ruta js para manejar esa ruta, se realiza una solicitud al /#/whateverservidor, que es solo una solicitud para /toda la página web.

Entonces, por ejemplo, si quería hacer una solicitud /correct/somejsfile.jspero no la escribí correctamente, /wrong/somejsfile.jsla solicitud se realiza al servidor. Esa ubicación / archivo no existe, por lo que el servidor responde con un 302 location: /#/wrong/somejsfile.js. El navegador sigue felizmente la redirección y se devuelve toda la página web. El navegador analiza la página como js y obtienes

SyntaxError no capturado: token inesperado <

Entonces, para ayudar a encontrar la ruta / solicitud ofensiva, busque 302 solicitudes.

Espero que ayude a alguien.

Jerinaw
fuente
1

Tuve el mismo problema y resultó que el Json que regresó del servidor no era Json-P válido. Si no usa la llamada como una llamada de dominio cruzado, use Json regular.

jakob
fuente
OP usa JSON, no JSONP.
Michał Perłakowski
0

Obtuve un " SyntaxError: Unexpected token I" cuando jQuery.getJSON()intentaba des serializar un valor de coma flotante de Infinity, codificado como INF, que es ilegal en JSON.

Mark Cidade
fuente
1
Esta pregunta es sobre "token inesperado : ".
Michał Perłakowski
0

En mi caso, me encontré con el mismo error, mientras ejecutaba la aplicación Spring mvc debido a una asignación incorrecta en mi controlador mvc

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

Cambié la asignación anterior a

 @RequestMapping("/private/updatestatus")

o

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

Para mí, la bombilla se encendió cuando vi la fuente en la página dentro del navegador Chrome. Tenía un soporte adicional en una declaración if. Inmediatamente verá el círculo rojo con una cruz en la línea que falla. Es un mensaje de error bastante inútil, porque el error de sintaxis no capturado: el token inesperado no hace referencia a un número de línea cuando aparece por primera vez en la consola de Chrome.

JGFMK
fuente
0

Hice mal en esto

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

Ya he inicializado la fsvariable, pero otra vez puse varen la segunda línea, esta también da ese tipo de error ...

Jana
fuente
0

Para aquellos que experimentan esto en AngularJs 1.4.6 o similar, mi problema fue que angular no encontró mi plantilla porque no se pudo encontrar el archivo en la templateUrl(ruta) que proporcioné. Solo tenía que proporcionar un camino accesible y el problema desapareció.

lwdthe1
fuente
resolví el mismo problema corrigiendo la URL de baseref - apunté a la carpeta raíz => <base href = "/">
Abdeali Chandanwala
0

En mi caso, era una URL errónea (no existente), por lo que tal vez su 'envío' en la segunda línea debería ser otra ...

Michal - wereda-net
fuente
0

Mi error fue olvidar una cita simple / doble alrededor de la URL en JavaScript:

entonces el código equivocado era:

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

y código correcto :

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

SyntaxError no detectada: fichas inesperado }

Chrome me dio el error para este código de muestra:

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

y lo resolvió arreglando el onclick para que sea como

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

Pero el error no tiene nada que ver con el problema.

ungalcrys
fuente
OP preguntó sobre "token inesperado : ".
Michał Perłakowski