Dans un composant d'application React qui gère des flux de contenu de type Facebook, je rencontre une erreur :
Feed.js:94 undefined "parsererror" "SyntaxError : Unxpected token < in JSON at position 0".
J'ai rencontré une erreur similaire qui s'est avérée être une faute de frappe dans le HTML de la fonction de rendu, mais cela ne semble pas être le cas ici.
Plus déroutant encore, j'ai ramené le code à une version antérieure, connue pour fonctionner, et j'obtiens toujours l'erreur.
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
Dans les outils de développement de Chrome, l'erreur semble provenir de cette fonction :
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)
});
},
avec la ligne console.error(this.props.url, status, err.toString()
soulignés.
Puisque l'erreur semble avoir un rapport avec l'extraction de données JSON du serveur, j'ai essayé de démarrer à partir d'une base de données vierge, mais l'erreur persiste. L'erreur semble être appelée dans une boucle infinie, vraisemblablement parce que React essaie continuellement de se connecter au serveur et finit par faire planter le navigateur.
EDIT :
J'ai vérifié la réponse du serveur avec Chrome dev tools et Chrome REST client, et les données semblent être du JSON correct.
EDIT 2 :
Il semble que, bien que le point de terminaison de l'API prévu renvoie effectivement les données et le format JSON corrects, React interroge les données de l'API. http://localhost:3000/?_=1463499798727
au lieu de l'attendu http://localhost:3001/api/threads
.
J'exécute un serveur de recharge à chaud de webpack sur le port 3000 avec l'application express s'exécutant sur le port 3001 pour renvoyer les données du backend. Ce qui est frustrant ici, c'est que cela fonctionnait correctement la dernière fois que j'ai travaillé dessus et je n'arrive pas à trouver ce que j'aurais pu changer pour le casser.
24 votes
Cela suggère que votre "JSON" est en fait du HTML. Regardez les données que vous recevez en retour du serveur.
3 votes
C'est l'erreur que vous obtenez si vous faites quelque chose comme
JSON.parse("<foo>")
-- une chaîne JSON (ce que vous attendez avecdataType: 'json'
) ne peut pas commencer par<
.0 votes
Comme @quantin l'a dit, cela peut être du html, peut-être une erreur, essayez la même url avec d'autres clients.
0 votes
Comme je l'ai mentionné, j'ai essayé avec une base de données vide (qui renvoie simplement []) et cela donne toujours la même erreur.
0 votes
Vous aurez probablement besoin de proxyer les demandes d'API en fonction de votre système d'information.
NODE_ENV
. Voir ça : github.com/facebookincubator/create-react-app/blob/master/0 votes
@apsillers Je pense que c'est mon problème. Je stocke des chaînes HTML avec du balisage dans mon objet JSON pour l'affichage. Dois-je échapper tous les caractères HTML pour que cela fonctionne ?
0 votes
Je vous suggère d'utiliser github.com/axios/axios
0 votes
J'ai rencontré cette erreur en utilisant
if($_POST['key'])
au lieu deif(isset($_POST['key']))
Bien qu'il s'agisse d'une erreur très bête et d'un amateur, j'espère que certains développeurs de LIY comme moi pourront trouver cela utile.