Erro de sintaxe não capturado: token inesperado:

193

Estou executando uma chamada AJAX no meu script MooTools, isso funciona bem no Firefox, mas no Chrome estou recebendo um Uncaught SyntaxError: Unexpected token :erro, não consigo determinar o porquê. Comentar o código para determinar onde o código incorreto não produz nada, acho que pode ser um problema com o retorno do JSON. Verificando no console, vejo o JSON retornado, é este:

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

Não vejo nenhum problema, por que esse erro ocorre?

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
fonte
1
O JSON está bem. O problema provavelmente é como você lida com isso. Mostrar o código ajudará.
tcooc
1
Adicionada a parte do código à pergunta.
trobrock
Não parece haver nada de errado com a sintaxe, o JS nem o JSON. A publicação de um caso de teste (não) funcionando no jsfiddle.net ajudaria - incluindo HTML.
Oskar Krawczyk
1
Atualmente, estou conectando a Internet para que meu modem comprima a fonte HTML dos sites em que navego, para que eu realmente não consiga entender o código. Mas, para iniciantes, coloque todos os códigos JS em arquivos externos - isso sempre facilita a depuração - você saberá se o erro é causado por JS ou outra coisa.
Oskar Krawczyk
2
Um "token inesperado" provavelmente é algum código de caractere ilegal. É provável que esse código não seja exibido quando você imprime no console. Portanto, imprima a string um caractere de cada vez ou use um analisador de protocolo ou depurador etc. para ver os bytes reais da string.
GroovyDotCom

Respostas:

93

Vendo erros vermelhos

SyntaxError não capturado: token inesperado <

na guia console do desenvolvedor do Chrome, há uma indicação de HTML no corpo da resposta.

Na verdade, o que você está vendo é a reação do seu navegador à inesperada linha superior <!DOCTYPE html>do servidor.

Andy Magoon
fonte
4
Não sei por que você está falando sobre "token inesperado <" quando se trata de uma pergunta Unexpected token :. Sua resposta não tem nenhuma relação com o problema do OP.
Michał Perłakowski
1
E como faço para corrigir isso? Eu tenho um redirecionamento php que está causando isso no Chrome.
Works for a Living
7
Para adicionar ao @andy_magoon, no meu caso, eu tinha uma tag de script que deveria servir javascript, mas porque a solicitação foi redirecionada para uma página HTML (não é importante porque foi redirecionada), que começa com <! DOCTYPE html >, que não é javascript válido, o navegador retorna o SyntaxError quando tenta analisar o HTML como JS.
David.barkhuizen
2
@Thom A maneira de corrigi-lo é garantir que o HTTP get retorne o arquivo javascript que você está procurando, e não um HTML inesperado.
David.barkhuizen
1
Eu recebi exatamente esse erro porque, como se vê, o caminho do arquivo está incorreto e não consegue encontrar o arquivo especificado na tag de script.
newman
80

Apenas um FYI para pessoas que podem ter o mesmo problema - eu apenas tive que fazer meu servidor enviar o JSON como application / json e o manipulador padrão do jQuery funcionou bem.

Edward Abrams
fonte
4
Eu acho que estou tendo o inverso desse problema. Estou solicitando JSON de uma API de terceiros e eles estão retornando application / javascript como resposta e estou recebendo o mesmo erro que você relatou nesta pergunta. Não tenho certeza de como lidar com isso.
Wuliwong
5
Um problema estranho é - ele funciona bem no host local, mas não no servidor. Alguma idéia do porquê?
VishwaKumar 15/10
Olá. Estou com um problema exato e não consigo resolvê-lo. Alguém pode me dizer como você envia o JSON de volta ao servidor
Alen
Obrigado, estava enviando application / javascript (como interpretei mal este SO ) e estava recebendo esse erro no JSON válido simples. Alterá-lo para application/jsonresolver o erro. Eu não estou usando JSONP.
Scipilot
Mesmo que eu estou recebendo o mesmo erro "Uncaught SyntaxError: símbolo inesperado:", mesmo depois de receber a resposta no formato JSON { "sucesso": É verdade, "dados": 2593}
Rupali Pemare
41

Isso acabou de acontecer comigo, e o motivo não foi um dos motivos acima. Eu estava usando o comando jQuery getJSON e adicionando callback=?para usar JSONP (conforme eu precisava entrar em vários domínios), retornando o código JSON {"foo":"bar"}e obtendo o erro.

Isso porque eu deveria ter incluído os dados de retorno de chamada, algo como jQuery17209314005577471107_1335958194322({"foo":"bar"})

Aqui está o código PHP que eu usei para fazer isso, que degrada se JSON (sem retorno de chamada) for usado:

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

Espero que ajude alguém no futuro.

Grim ...
fonte
Isto me ajudou bastante. Devemos agrupar os dados json com dados jsoncallback sempre que estiver usando o método jsonp. Além disso, os dados do jsonpcallback não devem começar com números. Quando tentei com números, não deu certo. Quando eu tentei com o mesmo formato mostrado nesta resposta, ele trabalhou ...
Ganesh Babu
É verdade, mas o erro é o mesmo e o código será degradado normalmente e ainda funcionará se o JSON estiver sendo usado.
Grim ...
Isso funcionou para mim com AJAX, jQuery e JSONP. Muito obrigado!
Piotr Wittchen 03/03/19
16

Acabei de resolver o problema. Havia algo causando problemas com uma chamada de solicitação padrão, então este é o código que eu usei:

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 alguém souber por que o objeto Request padrão estava me dando problemas, eu adoraria saber.

trobrock
fonte
3
a diferença entre o pedido padrão e request.json é principalmente nos cabeçalhos, ele adiciona this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- figura go
Dimitar Christoff
Estranho é isso que estava causando o problema com isso.
Trobrock 01/07/10
3
Quais são as duplas $$lá?
falsarella 27/09/12
@DimitarChristoff - alguma resposta para falsarella sobre o $$?
urso
1
@bear O seletor de dólar duplo é definido no MooTools.
Anthony Faull
10

Pensei em adicionar meu problema e resolução à lista.

Eu estava recebendo: Uncaught SyntaxError: Unexpected token <e o erro estava apontando para esta linha na minha declaração de sucesso do ajax:

var total = $.parseJSON(response);

Mais tarde, descobri que, além dos resultados do json, havia o envio de HTML com a resposta, porque havia um erro no meu PHP. Quando você recebe um erro no PHP, pode configurá-lo para avisá-lo com enormes tabelas laranja e essas tabelas foram o que estava jogando fora o JSON.

Eu descobri isso apenas fazendo um console.log(response)para ver o que realmente estava sendo enviado. Se houver um problema com os dados JSON, tente ver se você pode executar um console.log ou alguma outra instrução que permita ver o que é enviado e o que é recebido.

Keven
fonte
1
Eu fiz isso. Eu estava ecoando json em algum lugar no meu arquivo php e estava recebendo php [// json data] na minha resposta, mas não consegui analisá-lo. Obrigado por postar isso para que eu pudesse descobrir o meu próprio erro.
Nicholas Decker
O problema do OP é completamente diferente. No seu caso, você está tentando analisar HTML como JSON e, no (s) caso (s) do OP, ele está tentando analisar JSON como JavaScript.
Michał Perłakowski
7

Quando você solicita seu arquivo JSON, o servidor retorna o Content-Typecabeçalho JavaScript ( text/javascript) em vez de JSON ( application/json).

De acordo com os documentos do MooTools :

As respostas com o tipo de conteúdo javascript serão avaliadas automaticamente.

Como resultado, o MooTools tenta avaliar seu JSON como JavaScript e quando você tenta avaliar esse JSON:

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

como JavaScript, o analisador trata {e }como um escopo de bloco em vez de notação de objeto. É o mesmo que avaliar o seguinte "código":

"votes":47,"totalvotes":90

Como você pode ver, :é totalmente inesperado lá.

A solução é definir o Content-Typecabeçalho correto para o arquivo JSON. Se você salvá-lo com .jsonextensão, seu servidor deve fazê-lo sozinho.

Michał Perłakowski
fonte
4

Parece que sua resposta está sendo avaliada de alguma forma. Isso dá o mesmo erro no Chrome:

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

Isso se deve ao fato de os chavetas '{...}' serem interpretados pelo javascript como um bloco de código e não como um objeto literal como se poderia esperar.

Gostaria de olhar para a função JSON.decode () e ver se há uma avaliação lá.

Problema semelhante aqui: Eval () = Token inesperado: erro

Zectbumo
fonte
2

Se nada fizer sentido, esse erro também pode ser causado pelo erro PHP incorporado ao html / javascript, como o abaixo

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

Nem o <br />etc no código que é inserido no html pelo PHP está causando o erro . Para corrigir esse tipo de erro (suprimir aviso), use este código no início

error_reporting(E_ERROR | E_PARSE);

Para visualizar, clique com o botão direito do mouse na página "view source" e examine o html completo para identificar esse erro.

Hammad Khan
fonte
1

Aparência do erro " Untaught SyntaxError: token inesperado " quando seus dados retornam o formato json errado, em alguns casos, você não sabe que tem o formato json errado.
por favor verifique com alert (); função

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

sua mensagem recebida deve ser: {"firstName": "John", "lastName": "Doe"}
e você pode usar o código abaixo

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

com o erro " Untaught SyntaxError: token inesperado ",
mas se você errar o formato json
ex:

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

ou

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

para que você tenha o formato json errado, corrija-o antes de JSON.decode ou JSON.parse

Serip88
fonte
3
Eu recomendo usar em console.log()vez de alert()para depuração.
Michał Perłakowski
1

Isso aconteceu comigo hoje também. Eu estava usando EF e retornando uma Entidade em resposta a uma chamada AJAX. As propriedades virtuais da minha entidade estavam causando um erro de dependência cíclica que não estava sendo detectado no servidor. Adicionando o atributo [ScriptIgnore] nas propriedades virtuais, o problema foi corrigido.

Em vez de usar o atributo ScriptIgnore, provavelmente seria melhor retornar apenas um DTO.

Daryl
fonte
1

Isso aconteceu porque eu tenho uma configuração de regra no meu servidor expresso para rotear qualquer 404 de volta para /#mais qualquer que seja a solicitação original. Permitindo que o roteador angular / js manipule a solicitação. Se não houver uma rota js para manipular esse caminho, uma solicitação /#/whateverserá feita ao servidor, que é apenas uma solicitação para /toda a página da web.

Por exemplo, se eu quisesse fazer uma solicitação, /correct/somejsfile.jsmas não o escrevi, /wrong/somejsfile.jsa solicitação será feita ao servidor. Esse local / arquivo não existe, então o servidor responde com um 302 location: /#/wrong/somejsfile.js. O navegador segue alegremente o redirecionamento e a página inteira é retornada. O navegador analisa a página como js e você obtém

SyntaxError não capturado: token inesperado <

Portanto, para ajudar a encontrar o caminho / solicitação incorreto, procure 302 solicitações.

Espero que ajude alguém.

Jerinaw
fonte
1

Eu tive o mesmo problema e verificou-se que o Json retornado do servidor não era válido Json-P. Se você não usar a chamada como uma chamada entre domínios, use o Json regular.

jakob
fonte
O OP usa JSON, não JSONP.
Michał Perłakowski
0

Recebi um " SyntaxError: Unexpected token I" quando jQuery.getJSON()tentava desserializar um valor de ponto flutuante Infinitycodificado como INFilegal no JSON.

Mark Cidade
fonte
1
Esta pergunta é sobre "Token inesperado : ".
Michał Perłakowski
0

No meu caso, eu corri para o mesmo erro, ao executar o aplicativo spring mvc devido ao mapeamento errado no meu controlador mvc

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

eu mudei o mapeamento acima para

 @RequestMapping("/private/updatestatus")

ou

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

Para mim, a lâmpada acendeu quando eu vi a fonte na página dentro do navegador Chrome. Eu tinha um suporte extra em uma declaração if. Você verá imediatamente o círculo vermelho com uma cruz na linha que falhou. É uma mensagem de erro pouco útil, porque o erro de sintaxe não capturado: O token inesperado não faz referência a um número de linha quando ele aparece pela primeira vez no console do Chrome.

JGFMK
fonte
0

Eu errei nisso

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

Já intialized a fsvariável.Mas novamente eu coloquei varna segunda linha.Este também dá esse tipo de erro ...

Jana
fonte
0

Para aqueles que enfrentam isso no AngularJs 1.4.6 ou similar, meu problema era com o angular não encontrar meu modelo porque o arquivo no templateUrl(caminho) que forneci não foi encontrado. Eu só precisava fornecer um caminho acessível e o problema desapareceu.

lwdthe1
fonte
i resolvido o mesmo problema corrigindo a url baseref - apontou para pasta raiz => <base href = "/">
Abdeali Chandanwala
0

No meu caso, era um URL errado (não existente), então talvez o seu 'envio' na segunda linha deva ser outro ...

Michal - wereda-net
fonte
0

Meu erro foi esquecer as aspas simples / dupla em torno do URL em javascript:

código tão errado foi:

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

e código correto :

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

SyntaxError não capturado: token inesperado}

O Chrome me forneceu o erro para este código de exemplo:

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

e resolveu consertar o onclick para ser como

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

Mas o erro não tem nada a ver com o problema ..

ungalcrys
fonte
O OP perguntou sobre "Token inesperado : ".
Michał Perłakowski