Chrome: SyntaxError non intercepté: fin de saisie inattendue

179

Lors du chargement de ma page dans Google Chrome, j'obtiens une vague erreur dans la console:

Uncaught SyntaxError: fin inattendue de l'entrée

Je n'ai aucune idée de ce qui en est la cause. Comment procéder pour déboguer cette erreur?

dlaurent86
la source
2
Vérifier la réponse dans un renifleur de réseau peut vous donner un indice. Je suppose que l'en- Content-lengthtête spécifie plus d'octets que la réponse contient, ou peut-être que le serveur envoie en quelque sorte du HTML invalide.
tdammers
2
Manquant} la plupart du temps (javascript). Vérifiez la fin de vos cours et de vos fonctions. Essayez simplement d'ajouter une autre fermeture} à la fin de votre script et re-formatez automatiquement votre code. S'il y a une indentation étrange dans votre code, alors quelque part juste avant cela est probablement l'endroit où un} a disparu.
OG Sean
J'ai eu ce problème lors du chargement incorrect de JS. Je l'ai chargé comme <script>https://example.com/a.js</script>et il aurait dû être<script src="https://example.com/a.js"></script>
Daniel Apt
Je reçois cette erreur aujourd'hui sur Google Sheets. Je suppose que l'un de leurs fichiers JS est si gros qu'il se termine sans se charger complètement. Ou l'un de leurs serveurs d'applications a un bogue et ferme la connexion http avant que le fichier JS ne soit entièrement téléchargé.
Teddy le

Réponses:

230

Cette erreur particulière est un fait ennuyeux sur . Dans la plupart des cas, votre JavaScript est cassé d'une manière ou d'une autre. Par exemple, il manque un }ou quelque chose comme ça.

Exemple donné, cela produira également "Fin de saisie inattendue":

eval('[{"test": 4}') // notice the missing ]

Mais la cause profonde des problèmes semble être que l'URL JSON demandé a un type de contenu de text/htmllaquelle Chrome tente apparemment d'analyser comme HTML, qui ensuite les résultats à la fin inattendue de l' entrée en raison du fait que les balises d'image inclus sont en cours analysé.

Essayez de définir Content-Type sur text/plainJe pense que cela devrait résoudre les problèmes.

Néanmoins, V8 pourrait faire un meilleur travail en indiquant exactement l'entrée s'est terminée de manière inattendue.

Ivo Wetzel
la source
3
ok Merci beaucoup, j'ai supprimé la demande json tous ensemble et l'erreur a disparu, je n'ai pas encore compris ce qui ne va pas exactement avec ma demande json. je n'avais aucune idée par où commencer le débogage. si je peux vous demander comment avez-vous déterminé la cause première
dlaurent86
2
Ce n'est peut-être pas si évident. J'ai eu cette erreur sur le JS minifié en raison de sa mutilation par le minimiseur, alors que le JS non minifié était parfaitement légal et valide. Malheureusement, Chrome n'affiche que la ligne où l'erreur se produit, qui pour JS minimisé est généralement le fichier entier ...
Cerin
Pas tellement là où l'entrée s'est terminée (car ce serait à la fin). Au contraire, savoir ce qui était attendu aiderait des tonnes.
AndrewS
J'ai sauvé ma queue. J'étais terriblement ennuyé par l'ambiguïté. Merci.
Chypre106
4
J'ai eu la même erreur, car j'utilisais JSON.parse (texte) et la valeur du texte était une chaîne vide
A Khudairy
75

Essayez Firebug pour Mozilla - il affichera la position des disparus }.

http://getfirebug.com/


la source
13
N'a pas besoin de Firebug. La console de Firefox m'a dit exactement quelle ligne et quel caractère manquaient
Dylan Valade
1
Je n'avais pas besoin non plus de Firefug. La console Firefox ctrl+shift+ivous le dira.
Benjamin Crouzier
1
Attention, si le script est réduit à une seule et énorme ligne, attendez-vous à ce que Firefox se bloque pendant plusieurs minutes / heures / années.
Cerin
1
C'est de loin le moyen le plus simple de détecter ces erreurs de syntaxe
BentOnCoding
mon dieu, merci. J'ai l'impression que Chrome est tellement en avance par rapport à Firefox en termes d'outils de développement. c'est incroyable de voir comment il ne parvient pas à bien faire cette petite chose. m'a sauvé d'un gros mal de tête!
Isaiah Lee
34

Voir mon cas sur une autre question similaire :

Dans mon cas, j'essayais d'analyser un JSON vide:

JSON.parse(stringifiedJSON);

En d'autres termes, ce qui s'est passé est le suivant:

JSON.parse("");
falsarella
la source
2
Oui j'ai eu celui-là aussi! Vous pouvez résoudre facilement en fournissant "{}" au lieu d'une chaîne vide
cronoklee
1
Je recevais json vide en raison d'une double barre oblique dans une URL (ex. Localhost: 8080 // mypath / blagh) et le serveur renvoyait une réponse vide pour cela.
jpierson
1
Je suis venu ici juste pour confirmer cette solution.
Luís Assunção
10

J'obtiens cette erreur lorsque j'ai omis un caractère d'accolade fermant ( }) dans le code JavaScript. Vérifiez que vos accolades sont correctement équilibrées.

RAP
la source
10

Pour mémoire, pour quiconque essaie de trouver les différentes causes de cette erreur. Un attribut de données HTML5 vide

data-mydata = ''

provoque également l'erreur. Vous devez vérifier si la valeur des données est une chaîne nulle et ne pas inclure du tout l'attribut. Il va sans dire que cela est largement pertinent pour le HTML généré par script.

DroidOS
la source
Je n'aurais jamais compris cela sans vous. J'utilisais VideoJS et j'ai copié le code HTML de leur lecteur vidéo à partir de leur page. Il y avait un espace réservé d'attribut de données que vous pouviez utiliser, mais ce n'était pas le cas. La vidéo ne se chargeait pas et j'obtenais l'erreur dont tout le monde parle. Après la suppression, data-setup='{"example_option":true}' tout fonctionnait très bien.
Tyler Buchea
1
@ user1002379, heureux de pouvoir vous aider.
DroidOS
8

Le problème pour moi était que je faisais $ .ajax avec dataType: "json"pour une requête POST qui renvoyait un HTTP 201 (créé) et aucun corps de requête. Le correctif consistait simplement à supprimer cette clé / valeur.

Blaskovicz
la source
J'ai commencé une demande ajax (téléchargement) et l'ai abandonnée avant qu'elle ne soit terminée et j'ai eu cette erreur.
Dustin Poissant
6

JSHint est bon pour trouver l'emplacement des crochets manquants ou une mauvaise syntaxe.

Harfatum
la source
6

Une autre cause de cette erreur: si votre API répond intentionnellement sans corps de réponse, mais répond avec un 200 OKcode d'état au lieu d'un 204 No Contentcode d'état. Certaines bibliothèques JavaScript peuvent ne pas bien répondre aux types de contenu inattendus en l'absence de contenu, utilisez donc le code d'état correct!

Andrew
la source
3

Il y aura certainement un crochet ouvert qui a causé l'erreur.

Je vous suggère d'ouvrir la page dans Firefox, puis d'ouvrir Firebug et de vérifier la console - elle affichera le symbole manquant.

Exemple de capture d'écran:

Firebug mettant en évidence l'erreur

MKD
la source
3

Mon problème était avec le cache de Google Chrome. J'ai testé cela en exécutant mon application Web sur Firefox et je n'ai pas eu cette erreur là-bas. Alors j'ai décidé d'essayer de vider le cache de Google Chrome et cela a fonctionné.

Amir Al
la source
1

Dans les cas où votre code JavaScript est réduit à une seule ligne, une autre cause de cette erreur est d'utiliser //au lieu de /**/pour vos commentaires.

Mauvais (commente tout après avoir //inclus la clôture }de votre fonction)

function example() { //comment console.log('TEST'); }

Bien (limite votre commentaire)

function example() { /* comment */ console.log('TEST'); }
Johan Doe
la source
Travaillé, De plus, vous devriez utiliser \ "the-text \" comme se réfère à "the-text" également pour la diffusion.
Bay le
1

Dans mon cas, j'ajoutais du javascript de manière dynamique et en utilisant des guillemets doubles 2 fois dans des modèles de chaîne, j'ai donc changé la seconde en guillemets simples et l'erreur a disparu. J'espère que cela aidera certaines des personnes qui viennent ici pour la même raison.

George_kane
la source
en utilisant addthis j'ai ajouté à l'URL avec une double chaîne, puis changé en guillemet simple et l'erreur de console a disparu
tfa
0

J'ai rencontré un problème similaire en utilisant la directive bootstrap de l'interface utilisateur pour angularjs - uib-datepicker, en appuyant sur le bouton am / pm.

Erreur dans le gestionnaire d'événements pour (inconnu): SyntaxError: Fin inattendue du timepicker angulaire d'entrée JSON

Il s'est avéré que c'était à cause du plugin 'Trans-over' (qui traduit un mot quand on clique dessus). Peut-être que ma réponse aidera quelqu'un, car je n'ai rien trouvé sur Internet.

OlehZiniak
la source
0

Comme il s'agit d'une opération asynchrone, onreadystatechangecela peut se produire avant que la valeur ne soit chargée dans le responseText, essayez d'utiliser a window.setTimeout(function () { JSON.parse(xhr.responseText); }, 1000); pour voir si l'erreur persiste? BOL

safhac
la source
0

J'ai eu cette erreur et je l'ai corrigée en ajoutant la garde readyStateet statusmontrée ici:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
          // Your code here
   }
};
Brique
la source
0

si vous avez une erreur au tag Anchor, remplacez simplement «Onclick» par «href» ou «href» par «Onclick»

Harsha Annareddy
la source
0

Définir l'en- Accepttête application/jsondans la demande a fonctionné pour moi lorsque j'ai rencontré le même problème.

Stefano Populin
la source
0

Essayer d'analyser un JSON vide peut être la cause de cette erreur.

Lorsque vous recevez une réponse du serveur ou autre, vérifiez d'abord si elle n'est pas vide. Par exemple:

function parseJSON(response) {
    if (response.status === 204 || response.status === 205) {
        return null;
    }
    return response.json();
}

Ensuite, vous pouvez récupérer avec:

fetch(url, options).then(parseJSON); 
Rivelbab
la source
0

Dans mon cas, j'avais une faible vitesse Internet, lorsque je désactive la connexion Internet de l'autre utilisateur, l'erreur a disparu, étrange

Shahid Islam
la source