Chrome: Uncaught SyntaxError: Несподіваний кінець введення


176

Під час завантаження моєї сторінки в Google Chrome я отримую неясну помилку в консолі:

Uncaught SyntaxError: Несподіваний кінець введення

Я поняття не маю, що це викликає. Як би я міг пролагоджувати цю помилку?


2
Перевірка відповіді в мережевому сніфері може дати вам підказку. Я здогадуюсь, що Content-lengthзаголовок задає більше байтів, ніж містить відповідь, або, можливо, сервер якось надсилає недійсний HTML.
tdammers

2
Відсутнє} найбільше часу (javascript). Перевірте кінець своїх занять та функцій. Спробуйте просто додати ще одне закриття} в кінці сценарію та повторно відформатуйте код. Якщо у вашому коді є якісь дивні відступи, то десь прямо перед цим, швидше за все, місце, де а} пропав безвісти.
OG Шон

У мене виникла ця проблема при неправильному завантаженні JS. Я завантажив його так, як <script>https://example.com/a.js</script>і мав бути<script src="https://example.com/a.js"></script>
Даніель, Apt,

Я отримую цю помилку сьогодні в Google Таблицях. Я здогадуюсь, що один з їх файлів JS настільки великий, що його завершення припиняється без повного завантаження. Або один з їх серверів додатків має помилку і закриває HTTP-з'єднання до повного завантаження файлу JS.
Тедді

Відповіді:


227

Ця конкретна помилка є одним із прикрою фактом . У більшості випадків Ваш JavaScript якимось чином порушений. Наприклад, відсутні }або щось подібне.

Наведений приклад, це також дасть "Неочікуваний кінець введення":

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

Але першопричиною проблем, здається, є те, що запитуваний URL JSON має тип вмісту, text/htmlякий Chrome, мабуть, намагається проаналізувати як HTML, що призводить до несподіваного завершення введення через те, що включені теги зображення розібраний

Спробуйте встановити Content-Type , щоб text/plainя думаю , що це має виправити проблеми.

Тим не менше, V8 міг би зробити кращу роботу щодо того, щоб точно сказати, де вхід несподівано закінчився.


2
Ок, спасибі, я все разом видалив запит на json, і помилка пішла, я ще не зрозумів, що саме не так з моїм запитом на json. я просто не мав уявлення, з чого почати налагодження. якщо я можу запитати, як ти визначив першопричину
dlaurent86

2
Це може бути не так очевидно. Я отримав цю помилку на мінімізованому JS через те, що він керується мінімізатором, тоді як немініфікований JS був абсолютно законним та дійсним. На жаль, Chrome показує лише рядок, де виникає помилка, а для мінімізованого JS зазвичай це весь файл ...
Cerin

Не так багато, де закінчився вхід (бо це було б наприкінці). Швидше, знання того, що очікувалося, допоможе тонам.
AndrewS

Врятував мій хвіст. Мене страшенно дратувало двозначність. Дякую.
Cyprus106

4
У мене була така ж помилка, оскільки я використовував JSON.parse (текст), а значення тексту було порожнім рядком
A Худаїр,

73

Спробуйте Firebug для Mozilla - він покаже позицію зниклих }.

http://getfirebug.com/


12
Firebug не знадобився. Консоль у Firefox мені точно сказала, якої лінії та якого персонажа не вистачає
Ділан Валаде

1
Також не знадобилася пожежна машина. Консоль Firefox ctrl+shift+iпідкаже вам.
Бенджамін Крозьє

1
Попередження, якщо сценарій зведений до одного величезного рядка, очікуйте, що Firefox висить кілька хвилин / годин / років.
Серін

1
Це, безумовно, найпростіший спосіб відстежити ці синтаксичні помилки
BentOnCoding

боже мій, дякую. Я відчуваю, що хром настільки випереджає порівняно з Firefox з точки зору інструментів для розробників. дивно, як це не вдається отримати цю маленьку річ, хоча. врятувало мене від великого головного болю!
Ісая Лі

33

Дивіться мій випадок з іншого подібного питання :

У моєму випадку я намагався розібрати порожній JSON:

JSON.parse(stringifiedJSON);

Іншими словами, сталося таке:

JSON.parse("");

2
Так, у мене був і цей! Ви можете легко вирішити, надавши "{}" замість порожньої рядки
cronoklee

1
Я отримував порожній json через подвійний нахил вперед у URL-адресі (наприклад, localhost: 8080 // mypath / blagh), і сервер повертав порожню відповідь на це.
jpierson

1
Я прийшов сюди просто для підтвердження цього рішення.
Luís Assunção

10

Я отримую цю помилку, коли }в коді JavaScript пропустив символ, що закриває дужку ( ). Переконайтеся, що ваші брекети правильно збалансовані.


10

Для запису для тих, хто намагається знайти різні причини цієї помилки. Порожній атрибут даних HTML5

data-mydata = ''

також викликає помилку. Ви повинні перевірити, коли значення даних є нульовим рядком, і не включати атрибут взагалі. Само собою зрозуміло, що це багато в чому стосується HTML, створеного скриптом.


Ніколи б не зрозумів цього без тебе. Я використовував VideoJS, і скопіював html для їх відеоплеєра зі своєї сторінки. Він мав заповнення заповнення даних-атрибута, яким ви могли користуватися, але я не був. Відео не завантажувалося, і я отримував помилку, про яку всі говорять. Після видалення data-setup='{"example_option":true}' Все працювало чудово.
Тайлер Бучея

1
@ user1002379, щасливий, що можу допомогти.
DroidOS

8

Проблема для мене полягала в тому, що я робив $ .ajax dataType: "json"для запиту POST, який повертав HTTP 201 (створений), і не було запиту. Виправлення полягало в тому, щоб просто видалити цей ключ / значення.


Я запустив запит (завантаження) ajax і скасував його до завершення, і я отримав цю помилку.
Дастін Пуассан


6

Ще одна причина цієї помилки: якщо ваш API навмисно не відповідає органом відповіді, але відповідає 200 OKкодом статусу замість 204 No Contentкоду статусу. Деякі бібліотеки JavaScript можуть не реагувати на несподівані типи вмісту, коли немає вмісту, тому використовуйте правильний код статусу!


3

Однозначно буде відкрита дужка, яка спричинила помилку.

Я б запропонував вам відкрити сторінку в Firefox, потім відкрити Firebug і перевірити консоль - на ній з’явиться відсутній символ.

Приклад знімка екрана:

Firebug, що виділяє помилку


2

Моя проблема була з кешем Google Chrome. Я перевірив це, запустивши свій веб-додаток на Firefox, і я не отримав цієї помилки там. Тоді я вирішив спробувати спорожнити кеш Google Chrome, і це спрацювало.


1

У випадках, коли ваш код JavaScript зведений до одного рядка, інша причина цієї помилки використовується //замість /**/ваших коментарів.

Погано (коментує все після //включення до закриття }функції)

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

Добре (обмежує ваш коментар)

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

Працюючи, Плюс, ви повинні використовувати \ "текстовий текст \", як це стосується "тексту", також для кастингу.
Бей

1

У моєму випадку я динамічно додавав JavaScript і використовував подвійні лапки 2 рази в рядкових шаблонах, тому я змінив другий на одинарні лапки, і помилка не стала. Я сподіваюся, що це допоможе деяким з людей, які приїжджають сюди з тієї ж причини.


за допомогою addthis я додав URL-адресу з подвійним рядком, а потім змінив на єдину цитату і помилка консолі зникла
tfa

0

Я зіткнувся з подібною проблемою, використовуючи директиву uot bootstrap для angularjs - uib-datepicker, натискаючи перемикач am / pm.

Помилка в обробці подій для (невідомо): SyntaxError: Несподіваний кінець кутового вибору часу вводу JSON

Виявилося, це через плагін "Trans-over" (який перекладає слово при натисканні на нього). Можливо, моя відповідь комусь допоможе, бо я нічого не знайшов в Інтернеті.


0

Оскільки це операція асинхронізації, onreadystatechangeможливо, це станеться перед завантаженням значення у responseText, спробуйте скористатись a, window.setTimeout(function () { JSON.parse(xhr.responseText); }, 1000); щоб побачити, чи помилка зберігається? БОЛ


0

У мене виникла помилка та її виправили, додавши захист readyStateта statusпоказавши тут:

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


0

Налаштування Acceptзаголовка application/jsonв запиті працювало для мене, коли я зіткнувся з тією ж проблемою.


0

Спроба розбору порожнього JSON може бути причиною цієї помилки.

Коли ви отримаєте відповідь від сервера чи будь-чого іншого, спочатку перевірте, чи він не порожній. Наприклад:

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

Тоді ви можете отримати:

fetch(url, options).then(parseJSON); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.