"SyntaxError: jeton inattendu <dans JSON à la position 0" dans L'application React

Dans un composant D'application React qui gère les flux de contenu de type Facebook, Je rencontre une erreur:

Alimentation.js: 94 undefined" parsererror "" SyntaxError: jeton inattendu

J'ai rencontré une erreur similaire qui s'est avérée être une faute de frappe dans le HTML dans la fonction de rendu, mais cela ne semble pas être le cas ici.

Plus confusément, j'ai ramené le code à une version antérieure et connue et je reçois toujours l'erreur.

Alimentation.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 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é.

Comme il semble que l'erreur semble avoir quelque chose à voir avec l'extraction des données JSON du serveur, j'ai essayé de partir d'une base de données vide, mais l'erreur persiste. L'erreur semble être appelée dans une boucle infinie vraisemblablement car React essaie continuellement de se connecter au serveur et finit par planter le navigateur.

Modifier:

J'ai vérifié la réponse du serveur avec Chrome dev tools et Chrome REST client, et les données semblent être JSON correct.

Édition 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 http://localhost:3000/?_=1463499798727 au lieu du http://localhost:3001/api/threads attendu.

J'exécute un serveur webpack hot-reload sur le port 3000 avec l'Application express fonctionnant sur le port 3001 pour renvoyer les données backend. Ce qui est frustrant voici que cela fonctionnait correctement la dernière fois que j'ai travaillé dessus et ne trouve pas ce que j'aurais pu changer pour le casser.

105
demandé sur fragilewindows 2016-05-17 18:21:49

20 réponses

Le libellé du message d'erreur correspond à ce que vous obtenez de Google Chrome lorsque vous exécutez JSON.parse('<...'). Je sais que vous avez dit que le serveur définit Content-Type:application/json, mais je suis amené à croire que la réponse body est en fait HTML.

Feed.js:94 undefined "parsererror" "SyntaxError: Unexpected token < in JSON at position 0"

, Avec la ligne console.error(this.props.url, status, err.toString()) souligné.

Le err a été lancé dans jQuery, et vous a été transmis en tant que variable err. La raison pour laquelle cette ligne est soulignée est simplement parce que c'est là que vous vous connectez il.

Je vous suggère d'ajouter à votre journalisation. En regardant les propriétés xhr (XMLHttpRequest) réelles pour en savoir plus sur la réponse. Essayez d'ajouter console.warn(xhr.responseText) et vous verrez très probablement le code HTML reçu.

99
répondu George Bailey 2016-05-17 15:49:59

Vous recevez HTML (ou XML) du serveur, mais le dataType: json dit à jQuery d'analyser en tant que JSON. Vérifiez l'onglet "Réseau" dans Chrome dev tools pour voir le contenu de la réponse du serveur.

30
répondu nil 2016-05-17 15:29:43

Cela a fini par être un problème d'autorisations pour moi. J'essayais d'accéder à une url pour laquelle je n'avais pas d'autorisation avec cancan, donc l'url a été commutée à users/sign_in. l'url redirigée répond au html, pas au json. Le premier caractère d'une réponse html est <.

7
répondu Andrew Shenstone 2016-09-16 22:51:18

J'ai rencontré cette erreur "SyntaxError: token inattendu m dans JSON at position", où le token 'm' peut être n'importe quel autre caractère.

Il S'est avéré que j'ai manqué l'un des guillemets doubles dans l'objet JSON lorsque j'utilisais RESTconsole pour le test DB, comme {"name: "math"}, le bon devrait être {"name": "math"}

Il m'a fallu beaucoup d'efforts pour comprendre cette erreur maladroite. J'ai peur que d'autres se heurtent à des bummers similaires.

5
répondu VictorL 2017-01-08 06:27:05

Dans mon cas, l'erreur était due au fait que je n'attribuais pas ma valeur de retour à une variable. Ce qui suit a provoqué le message d'erreur:

return new JavaScriptSerializer().Serialize("hello");

Je l'ai changé en:

string H = "hello";
return new JavaScriptSerializer().Serialize(H);

Sans la variable JSON est incapable de formater correctement les données.

3
répondu Versatile 2016-10-27 17:06:04

Dans mon cas, je recevais ce webpack en cours d'exécution, et il s'est avéré être une corruption quelque part dans le répertoire local node_modules.

rm -rf node_modules
npm install

...était suffisant pour le faire fonctionner à nouveau.

3
répondu Kev 2017-01-07 12:43:05

Mon problème était que je récupérais les données dans un string qui n'était pas dans un format JSON approprié, que j'essayais alors de l'analyser. simple example: JSON.parse('{hello there}') donnera une erreur à h. Dans mon cas, l'url de rappel renvoyait un caractère inutile avant les objets: employee_names([{"name":.... et obtenait une erreur à e à 0. Mon URL de rappel elle-même avait un problème qui, une fois corrigé, ne renvoyait que des objets.

1
répondu Deke 2016-12-05 18:25:19

Cette erreur se produit lorsque vous définissez la réponse comme application/json et que vous obtenez un code HTML en tant que réponse. Fondamentalement, cela s'est produit lorsque vous écrivez un script côté serveur pour une url spécifique avec une réponse de JSON mais le format d'erreur est en HTML.

1
répondu sriram veeraghanta 2017-07-31 14:21:06

Dans mon cas, pour un site Angular 2/4 hébergé par Azure, mon API appelle mySite / api/... réorienter en raison monsite problèmes de routage. Donc, il renvoyait le HTML de la page redirigée au lieu de l'api JSON. J'ai ajouté une exclusion dans un web.fichier de configuration pour le chemin de l'api.

Je ne recevais pas cette erreur lors du développement local car le Site et L'API étaient sur des ports différents. Il y a probablement une meilleure façon de le faire ... mais il a travaillé.

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <system.webServer>
        <rewrite>
        <rules>
        <clear />

        <!-- ignore static files -->
        <rule name="AngularJS Conditions" stopProcessing="true">
        <match url="(app/.*|css/.*|fonts/.*|assets/.*|images/.*|js/.*|api/.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="None" />
        </rule>

        <!--remaining all other url's point to index.html file -->
        <rule name="AngularJS Wildcard" enabled="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
        <action type="Rewrite" url="index.html" />
        </rule>

        </rules>
        </rewrite>
    </system.webServer>
</configuration>
1
répondu Dave 2018-01-10 22:38:51

Cela pourrait être vieux. Mais, cela s'est juste produit dans angular, le type de contenu pour la requête et la réponse étaient différents dans mon code. Donc, vérifiez les en-têtes pour,

 let headers = new Headers({
        'Content-Type': 'application/json',
        **Accept**: 'application/json'
    });

Dans React axios

axios({
  method:'get',
  url:'http://  ',
 headers: {
         'Content-Type': 'application/json',
        Accept: 'application/json'
    },
  responseType:'json'
})

JQuery Ajax:

 $.ajax({
      url: this.props.url,
      dataType: 'json',
**headers: { 
          'Content-Type': 'application/json',
        Accept: 'application/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)
    });
  },
1
répondu MPV 2018-02-09 21:42:00

J'ai eu le même message d'erreur suite à un tutoriel. Notre problème semble être 'url: cette.accessoires de jeu.url " dans l'appel ajax. À Réagir.DOM lorsque vous créez votre élément, le mien ressemble à ceci.

ReactDOM.render(
    <CommentBox data="/api/comments" pollInterval={2000}/>,
    document.getElementById('content')
);

Eh bien, cette zone de commentaires n'a pas d'url dans ses accessoires, juste des données. Quand j'ai changé url: this.props.url -> url: this.props.data, il a fait le bon appel au serveur et j'ai récupéré les données attendues.

J'espère que ça aide.

0
répondu Timea 2016-08-21 09:55:10

Après avoir passé beaucoup de temps avec eux, j'ai découvert que dans mon cas, le problème était d'avoir "page d'accueil", défini sur mon paquet.le fichier json a fait que mon application ne fonctionne pas sur firebase(même erreur' token'). J'ai créé mon application react en utilisant create-react-app, puis j'ai utilisé le guide firebase sur le READ.me fichier à déployer sur les pages github, réalisé que je devais faire un travail supplémentaire pour que le routeur fonctionne, et commuté à firebase. guide github avait ajouté la clé de la page d'accueil sur le paquet.json et causé le problème de déploiement.

0
répondu Alejandro B. 2017-01-06 16:58:56

Protip: test json sur un nœud local.serveur js? Assurez-vous que vous n'avez pas déjà quelque chose de routage vers ce chemin

'/:url(app|assets|stuff|etc)';
0
répondu dustintheweb 2017-01-25 20:31:01

Au niveau général, cette erreur se produit lorsqu'un objet JSON est analysé qui contient des erreurs de syntaxe. Pensez à quelque chose comme ceci, où la propriété message contient des guillemets doubles non échappés:

{
    "data": [{
        "code": "1",
        "message": "This message has "unescaped" quotes, which is a JSON syntax error."
    }]
}

Si vous avez JSON dans votre application quelque part, il est bon de l'exécuter via JSONLint pour vérifier qu'il n'a pas d'erreur de syntaxe. Habituellement, ce n'est pas le cas, mais dans mon expérience, C'est généralement JSON renvoyé d'une API qui est le coupable.

Lorsqu'une requête XHR est fait à une API HTTP qui renvoie une réponse avec un en-tête Content-Type:application/json; charset=UTF-8 qui contient JSON invalide dans le corps de la réponse, vous verrez cette erreur.

Si un contrôleur D'API côté serveur gère incorrectement une erreur de syntaxe et qu'il est imprimé dans le cadre de la réponse, cela va casser la structure de JSON renvoyée. Un bon exemple de ceci serait une réponse API contenant un avertissement ou un avis PHP dans le corps de la réponse:

<b>Notice</b>:  Undefined variable: something in <b>/path/to/some-api-controller.php</b> on line <b>99</b><br />
{
    "success": false,
    "data": [{ ... }]
}

, 95% du temps c'est la source du problème pour moi, et bien qu'il soit quelque peu abordé ici dans les autres réponses, Je ne pensais pas qu'il était clairement décrit. Espérons que cela aide, si vous cherchez un moyen pratique de trouver quelle réponse API contient une erreur de syntaxe JSON, j'ai écrit un module angulaire pour cela .

Voici le module:

/**
 * Track Incomplete XHR Requests
 * 
 * Extend httpInterceptor to track XHR completions and keep a queue 
 * of our HTTP requests in order to find if any are incomplete or 
 * never finish, usually this is the source  of the issue if it's 
 * XHR related
 */
angular.module( "xhrErrorTracking", [
        'ng',
        'ngResource'
    ] )
    .factory( 'xhrErrorTracking', [ '$q', function( $q ) {
        var currentResponse = false;

        return {
            response: function( response ) {
                currentResponse = response;
                return response || $q.when( response );
            },
            responseError: function( rejection ) {
                var requestDesc = currentResponse.config.method + ' ' + currentResponse.config.url;
                if ( currentResponse.config.params ) requestDesc += ' ' + JSON.stringify( currentResponse.config.params );

                console.warn( 'JSON Errors Found in XHR Response: ' + requestDesc, currentResponse );

                return $q.reject( rejection );
            }
        };
    } ] )
    .config( [ '$httpProvider', function( $httpProvider ) {
        $httpProvider.interceptors.push( 'xhrErrorTracking' );
    } ] );

Plus de détails peuvent être trouvés dans l'article de blog référencé ci-dessus, je n'ai pas posté tout trouvé ici car ce n'est probablement pas tout pertinent.

0
répondu Kevin Leary 2017-07-07 20:37:23

Pour moi, cela s'est produit lorsque L'une des propriétés de l'objet que je retournais en tant que JSON a lancé une exception.

public Dictionary<string, int> Clients { get; set; }
public int CRCount
{
    get
    {
        var count = 0;
        //throws when Clients is null
        foreach (var c in Clients) {
            count += c.Value;
        }
        return count;
    }
}

Ajout d'une vérification nulle, corrigé pour moi:

public Dictionary<string, int> Clients { get; set; }
public int CRCount
{
    get
    {
        var count = 0;
        if (Clients != null) {
            foreach (var c in Clients) {
                count += c.Value;
            }
        }
        return count;
    }
}
0
répondu Window 2017-10-27 16:59:44

Juste quelque chose de basique à vérifier, assurez - vous que vous n'avez rien commenté dans le fichier json

//comments here will not be parsed and throw error
0
répondu Akin Hwan 2017-11-27 15:42:06

Juste pour ajouter aux réponses, cela se produit également lorsque votre réponse API inclut

<?php{username: 'Some'}

Ce qui pourrait être un cas lorsque votre backend utilise PHP.

0
répondu Tushar Sharma 2017-12-07 01:26:49

En python, vous pouvez utiliser json.Dump (str) avant d'envoyer le résultat au modèle html. avec cette chaîne de commande convertir au format JSON correct et envoyer au modèle html. Après avoir envoyé ce résultat à JSON.parse (result), c'est une réponse correcte et vous pouvez l'utiliser.

0
répondu user2713125 2018-01-29 08:04:35

Pour certains, cela peut vous aider les gars: J'ai eu une expérience similaire avec L'API Wordpress REST. J'ai même utilisé Postman pour vérifier si j'avais les routes ou le point de terminaison corrects. J'ai découvert plus tard que j'avais accidentellement mis un "écho" dans mon script-hooks:

Débogage et vérification de votre console

Cause de l'erreur

Donc, fondamentalement, cela signifie que j'ai imprimé une valeur qui N'est pas JSON qui est mélangée avec le script qui provoque une erreur AJAX - " SyntaxError: token inattendu R in JSON à la position 0 "

0
répondu Ray Macz 2018-09-28 10:37:10

Jeton inattendu

Une solution simple à cette erreur est d'écrire un commentaire dans le fichier styles.less.

-4
répondu Dani 2017-03-05 20:10:58