Em um componente do aplicativo React que lida com feeds de conteúdo do tipo Facebook, estou com um erro:
Feed.js: 94 indefinido "parsererror" "SyntaxError: token inesperado <no JSON na posição 0
Corri para um erro semelhante que acabou por ser um erro de digitação no HTML dentro da função de renderização, mas isso não parece ser o caso aqui.
De maneira mais confusa, revirei o código para uma versão anterior conhecida e ainda estou recebendo o erro.
Feed.js:
import React from 'react';
var ThreadForm = React.createClass({
getInitialState: function () {
return {author: '',
text: '',
included: '',
victim: ''
}
},
handleAuthorChange: function (e) {
this.setState({author: e.target.value})
},
handleTextChange: function (e) {
this.setState({text: e.target.value})
},
handleIncludedChange: function (e) {
this.setState({included: e.target.value})
},
handleVictimChange: function (e) {
this.setState({victim: e.target.value})
},
handleSubmit: function (e) {
e.preventDefault()
var author = this.state.author.trim()
var text = this.state.text.trim()
var included = this.state.included.trim()
var victim = this.state.victim.trim()
if (!text || !author || !included || !victim) {
return
}
this.props.onThreadSubmit({author: author,
text: text,
included: included,
victim: victim
})
this.setState({author: '',
text: '',
included: '',
victim: ''
})
},
render: function () {
return (
<form className="threadForm" onSubmit={this.handleSubmit}>
<input
type="text"
placeholder="Your name"
value={this.state.author}
onChange={this.handleAuthorChange} />
<input
type="text"
placeholder="Say something..."
value={this.state.text}
onChange={this.handleTextChange} />
<input
type="text"
placeholder="Name your victim"
value={this.state.victim}
onChange={this.handleVictimChange} />
<input
type="text"
placeholder="Who can see?"
value={this.state.included}
onChange={this.handleIncludedChange} />
<input type="submit" value="Post" />
</form>
)
}
})
var ThreadsBox = React.createClass({
loadThreadsFromServer: function () {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function (data) {
this.setState({data: data})
}.bind(this),
error: function (xhr, status, err) {
console.error(this.props.url, status, err.toString())
}.bind(this)
})
},
handleThreadSubmit: function (thread) {
var threads = this.state.data
var newThreads = threads.concat([thread])
this.setState({data: newThreads})
$.ajax({
url: this.props.url,
dataType: 'json',
type: 'POST',
data: thread,
success: function (data) {
this.setState({data: data})
}.bind(this),
error: function (xhr, status, err) {
this.setState({data: threads})
console.error(this.props.url, status, err.toString())
}.bind(this)
})
},
getInitialState: function () {
return {data: []}
},
componentDidMount: function () {
this.loadThreadsFromServer()
setInterval(this.loadThreadsFromServer, this.props.pollInterval)
},
render: function () {
return (
<div className="threadsBox">
<h1>Feed</h1>
<div>
<ThreadForm onThreadSubmit={this.handleThreadSubmit} />
</div>
</div>
)
}
})
module.exports = ThreadsBox
Nas ferramentas de desenvolvedor do Chrome, o erro parece vir desta função:
loadThreadsFromServer: function loadThreadsFromServer() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function (data) {
this.setState({ data: data });
}.bind(this),
error: function (xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
com a linha console.error(this.props.url, status, err.toString()
sublinhada.
Como parece que o erro parece ter algo a ver com a retirada de dados JSON do servidor, tentei iniciar em um banco de dados em branco, mas o erro persiste. O erro parece ser chamado em um loop infinito, presumivelmente, pois o React tenta continuamente se conectar ao servidor e, eventualmente, trava o navegador.
EDITAR:
Verifiquei a resposta do servidor com as ferramentas de desenvolvimento do Chrome e o cliente REST do Chrome, e os dados parecem ser JSON adequados.
EDIT 2:
Parece que, embora o terminal da API pretendido esteja realmente retornando os dados e o formato JSON corretos, o React está pesquisando em http://localhost:3000/?_=1463499798727
vez do esperado http://localhost:3001/api/threads
.
Estou executando um servidor de recarga a quente do webpack na porta 3000 com o aplicativo expresso em execução na porta 3001 para retornar os dados de back-end. O que é frustrante aqui é que isso funcionou corretamente na última vez em que trabalhei nele e não consigo encontrar o que poderia ter mudado para quebrá-lo.
fonte
JSON.parse("<foo>")
- uma sequência JSON (com a qual você esperadataType: 'json'
) não pode começar<
.NODE_ENV
. Veja isto: github.com/facebookincubator/create-react-app/blob/master/…Respostas:
O texto da mensagem de erro corresponde ao que você recebe do Google Chrome quando executa
JSON.parse('<...')
. Sei que você disse que o servidor está configurandoContent-Type:application/json
, mas sou levado a acreditar que o corpo da resposta é realmente HTML.O
err
foi realmente jogado dentrojQuery
e passado para você como uma variávelerr
. A razão pela qual a linha está sublinhada é simplesmente porque é onde você a está registrando.Eu sugeriria que você adicionasse ao seu log. Examinando as propriedades reais
xhr
(XMLHttpRequest) para saber mais sobre a resposta. Tente adicionarconsole.warn(xhr.responseText)
e você provavelmente verá o HTML que está sendo recebido.fonte
console.warn(jqxhr.responseText)
. Isso foi muito útil para diagnosticar meu problema.console.log
,console.warn
econsole.error
vai todo gravação para o seu console. No entanto, o console geralmente fornece opções de filtro de log, portanto, verifique se elas estão ativadas ou desativadas, como preferir.Você está recebendo HTML (ou XML) de volta do servidor, mas
dataType: json
está dizendo ao jQuery para analisar como JSON. Verifique a guia "Rede" nas ferramentas de desenvolvimento do Chrome para ver o conteúdo da resposta do servidor.fonte
@Produces(MediaType.APPLICATION_JSON)
Isso acabou sendo um problema de permissões para mim. Eu estava tentando acessar um URL para o qual não tinha autorização com cancan, então o URL foi alterado para
users/sign_in
. o URL redirecionado responde ao html, não ao json. O primeiro caractere em uma resposta html é<
.fonte
Ocorreu o erro "SyntaxError: token inesperado m no JSON na posição", onde o token 'm' pode ser qualquer outro caractere.
Aconteceu que eu perdi uma das aspas duplas no objeto JSON quando estava usando o RESTconsole para teste de banco de dados, como {"name:" math "}, a correta deve ser {" name ":" math "}
Demorei muito esforço para descobrir esse erro desajeitado. Receio que outros encontrem chatices semelhantes.
fonte
No meu caso, eu estava obtendo este webpack em execução, e acabou havendo alguma corrupção em algum lugar no diretório node_modules local.
... foi o suficiente para fazê-lo funcionar novamente.
fonte
No meu caso, o erro foi resultado de não atribuir meu valor de retorno a uma variável. O seguinte causou a mensagem de erro:
Eu mudei para:
Sem a variável, o JSON não pode formatar corretamente os dados.
fonte
Este erro ocorre quando você define a resposta como
application/json
e está obtendo um HTML como resposta. Basicamente, isso aconteceu quando você estava escrevendo um script do lado do servidor para um URL específico com uma resposta JSON, mas o formato do erro está em HTML.fonte
Certifique-se de que a resposta esteja no formato JSON, caso contrário, dispara esse erro.
fonte
Eu estava enfrentando o mesmo problema,
removi o dataType: 'json' do método $ .ajax
fonte
Eu tive a mesma mensagem de erro após um tutorial. Nosso problema parece ser 'url: this.props.url' na chamada ajax. No React.DOM, quando você está criando seu elemento, o meu se parece com isso.
Bem, este CommentBox não tem um URL em seus props, apenas dados. Quando mudei
url: this.props.url
->url: this.props.data
, ele fez a chamada certa para o servidor e recuperei os dados esperados.Espero que ajude.
fonte
Meu problema era que eu estava recebendo os dados de volta em um formato
string
que não estava no formato JSON adequado, que eu estava tentando analisar.simple example: JSON.parse('{hello there}')
dará um erro em h. No meu caso, o URL de retorno de chamada estava retornando um caracter desnecessário antes dos objetos:employee_names([{"name":....
e estava recebendo erro de e em 0. Meu próprio URL de retorno de chamada tinha um problema que, quando corrigido, retornava apenas objetos.fonte
No meu caso, para um site Angular 2/4 hospedado no Azure, minha chamada de API para mySite / api / ... foi redirecionada devido a problemas de roteamento do mySite. Portanto, ele retornava o HTML da página redirecionada em vez do JSON da API. Eu adicionei uma exclusão em um arquivo web.config para o caminho da API.
Eu não estava recebendo esse erro ao desenvolver localmente porque o Site e a API estavam em portas diferentes. Provavelmente existe uma maneira melhor de fazer isso ... mas funcionou.
fonte
Isso pode ser antigo. Mas, apenas ocorreu em angular, o tipo de conteúdo para solicitação e resposta era diferente no meu código. Portanto, verifique os cabeçalhos,
em Axios de reação
jQuery Ajax:
fonte
Depois de passar muito tempo com isso, descobri que, no meu caso, o problema era ter "página inicial" definida no meu arquivo package.json, fazendo com que meu aplicativo não funcionasse na firebase (mesmo erro de 'token'). Criei meu aplicativo de reação usando create-react-app, depois usei o guia do firebase no arquivo READ.me para implantar nas páginas do github, percebi que tinha que fazer um trabalho extra para o roteador funcionar e mudei para o firebase. O guia github adicionou a chave da página inicial no package.json e causou o problema de implantação.
fonte
Protip: testando json em um servidor Node.js. local? Verifique se você ainda não possui um roteamento para esse caminho
fonte
Em geral, esse erro ocorre quando um objeto JSON é analisado com erros de sintaxe. Pense em algo assim, onde a propriedade da mensagem contém aspas duplas sem escape:
Se você tiver o JSON em seu aplicativo em algum lugar, é bom executá-lo no JSONLint para verificar se não há um erro de sintaxe. Normalmente, esse não é o caso, embora, na minha experiência, geralmente o JSON retorne de uma API que seja a culpada.
Quando uma solicitação XHR é feita para uma API HTTP que retorna uma resposta com um
Content-Type:application/json; charset=UTF-8
cabeçalho que contém JSON inválido no corpo da resposta, você verá esse erro.Se um controlador de API do servidor estiver lidando incorretamente com um erro de sintaxe e estiver sendo impresso como parte da resposta, isso quebrará a estrutura do JSON retornado. Um bom exemplo disso seria uma resposta da API contendo um aviso ou aviso do PHP no corpo da resposta:
Em 95% do tempo, essa é a fonte do problema para mim e, embora seja um pouco abordado aqui nas outras respostas, não achei que fosse descrito claramente. Espero que isso ajude, se você estiver procurando uma maneira prática de rastrear qual resposta da API contém um erro de sintaxe JSON que escrevi para o módulo Angular .
Aqui está o módulo:
Mais detalhes podem ser encontrados no artigo do blog mencionado acima, não publiquei tudo o que foi encontrado aqui, pois provavelmente nem tudo é relevante.
fonte
Para mim, isso aconteceu quando uma das propriedades do objeto que eu estava retornando como JSON lançou uma exceção.
Adicionando uma verificação nula, foi corrigida para mim:
fonte
apenas algo básico para verificar, verifique se você não tem nada comentado no arquivo json
fonte
Apenas para adicionar às respostas, isso também acontece quando sua resposta da API inclui
o que pode acontecer quando seu back-end está usando PHP.
fonte
Em python, você pode usar json.Dump (str) antes de enviar o resultado para o modelo html. com esta sequência de comandos, converta para corrigir o formato json e envie para o modelo html. Depois de enviar este resultado para JSON.parse (resultado), esta é a resposta correta e você pode usá-lo.
fonte
Para alguns, isso pode ajudar vocês: eu tive uma experiência semelhante com a API REST do Wordpress. Até usei o Postman para verificar se eu tinha as rotas ou o ponto final corretos. Mais tarde, descobri que acidentalmente coloquei um "eco" dentro do meu script - hooks:
Depure e verifique seu console
Causa do erro
Então, basicamente, isso significa que imprimi um valor que não é JSON que é misturado com o script que causa o erro AJAX - "SyntaxError: token inesperado r em JSON na posição 0"
fonte
Isso pode causar, porque seu código javascript está observando alguma resposta json e você recebeu outra coisa como texto.
fonte
Eu estava tendo o mesmo problema. Estou usando um servidor node.js simples para enviar resposta a um cliente feito no Angular 7. Inicialmente, estava enviando response.end ('Olá mundo do servidor nodejs'); para o cliente, mas de alguma forma angular não foi possível analisá-lo.
fonte
Aqueles que estão usando
create-react-app
e tentando buscar arquivos json locais.Como em
create-react-app
,webpack-dev-server
é usado para manipular a solicitação e para cada solicitação que ele atendeindex.html
. Então você está recebendoPara resolver isso, você precisa ejetar o aplicativo e modificar o
webpack-dev-server
arquivo de configuração.Você pode seguir as etapas aqui .
fonte
No meu caso (back-end), eu estava usando res.send (token);
Tudo foi corrigido quando mudei para res.send (data);
Convém verificar isso se tudo estiver funcionando e postando como pretendido, mas o erro continua aparecendo no seu front-end.
fonte
As possibilidades para esse erro são impressionantes.
No meu caso, descobri que o problema estava adicionando o
homepage
arquivado empackage.json
causou o problema.Vale a pena conferir: in
package.json
change:para
fonte
Em poucas palavras, se você está recebendo esse erro ou erro semelhante, isso significa apenas uma coisa. Ou seja, em algum lugar da nossa base de código estávamos esperando um formato JSON válido para processar e não conseguimos um. Por exemplo:
Irá gerar um erro, dizendo
Porque, o primeiro caractere
string
és
& não é um JSON válido agora. Isso também pode gerar erros no meio. gostar:Irá gerar erro:
porque intencionalmente perdemos uma cotação na string JSON
invalidJSON
na posição 36.E se você consertar isso:
lhe dará um objeto em JSON.
Agora, esse erro pode ser gerado em qualquer lugar e em qualquer estrutura / biblioteca. Na maioria das vezes, você pode estar lendo uma resposta de rede que não é JSON válida. Portanto, as etapas de depuração desse problema podem ser como:
curl
ou clique na API que você está chamando.JSON.parse
. Se você estiver recebendo um erro, corrija-o.fonte
Se alguém mais estiver usando a busca na documentação "Usando a busca" nas APIs da Web no Mozilla: (Isso é realmente útil: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch )
Isso estava dentro da função:
Eu estava passando para a minha função o
qr
que eu acreditava ser um objeto, porqueqr
era assim:{"name": "Jade", "lname": "Bet", "pet":"cat"}
mas eu continuava recebendo erros de sintaxe. Quando eu o designei para outra coisa:let qrdata = qr;
funcionou.fonte
Uma solução simples para esse erro é escrever um comentário no
styles.less
arquivo.fonte
styles.less
arquivo pode resolver o que parece ser um problema de código de servidor de back-end.