Chrome: Uncaught SyntaxError: Неожиданный конец ввода


177

При загрузке моей страницы в Google Chrome я получаю смутную ошибку в консоли:

Uncaught SyntaxError: Неожиданный конец ввода

Я понятия не имею, что вызывает это. Как мне отладить эту ошибку?


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

2
Отсутствует} большую часть времени (JavaScript). Проверьте конец ваших классов и функций. Попробуйте просто добавить еще один закрывающий} в конце вашего скрипта и переформатировать ваш код. Если в вашем коде есть какие-то странные отступы, то где-то прямо перед этим наиболее вероятно место, где a} пропал.
О. Г. Шон

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

Я получаю эту ошибку сегодня в Google Sheets. Я предполагаю, что один из их файлов JS настолько большой, что его загрузка завершается без полной загрузки. Или один из их серверов приложений имеет ошибку и закрывает соединение http до полной загрузки файла JS.
Тедди

Ответы:


228

Эта конкретная ошибка является одним раздражающим фактом о , В большинстве случаев ваш JavaScript каким-то образом нарушен. Например, отсутствует }или что-то подобное.

В приведенном примере это также приведет к «Неожиданному концу ввода»:

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

Но основная причина проблем , кажется, что запрашиваемая JSON URL имеет Content-Type из text/htmlкоторых Chrome , видимо , пытается разобрать , как HTML, который затем приводит к неожиданному концу ввода из - за того , что включенные тегами изображения, будет подаваться разобран.

Попробуйте установить Content-Type на text/plainя думаю, что это должно решить проблемы.

Тем не менее, V8 лучше справился бы с задачей точно сказать, где ввод неожиданно закончился.


3
Хорошо, спасибо, я удалил запрос json все вместе, и ошибка исчезла. Я еще не выяснил, что именно не так с моим запросом json. я просто понятия не имел, с чего начать отладку. если я могу спросить, как вы определили основную причину
dlaurent86

2
Это может быть не так очевидно. Я получил эту ошибку на минимизированном JS из-за того, что минимизатор искажал его, тогда как унифицированный JS был совершенно законным и действительным. К сожалению, Chrome показывает только строку, где происходит ошибка, которая для минимизированного JS обычно представляет собой весь файл ...
Cerin

Не так много, где заканчивается ввод (потому что это будет в конце). Скорее знание того, что ожидалось, помогло бы тоннам.
AndrewS

Спас мой хвост. Я был ужасно раздражен двусмысленностью. Спасибо.
Cyprus106

4
У меня была та же ошибка, потому что я использовал JSON.parse (текст), а текстовое значение было пустой строкой
Khudairy

73

Попробуйте Firebug для Mozilla - он покажет положение пропавших без вести }.

http://getfirebug.com/


13
Не нуждался в Firebug. Консоль в Firefox рассказала мне, какой именно строки и какого персонажа не хватало
Dylan Valade

1
Не нужно было и firefug. Консоль Firefox ctrl+shift+iскажет вам.
Бенджамин Крузье

1
Предупреждение: если сценарий свернут в одну огромную строку, ожидайте, что Firefox будет зависать в течение нескольких минут / часов / лет.
Cerin

1
На сегодняшний день это самый простой способ отследить эти синтаксические ошибки
BentOnCoding

Боже мой, спасибо. я чувствую, что Chrome так далеко впереди по сравнению с Firefox с точки зрения инструментов разработчика. Удивительно, как она не может правильно понять эту маленькую вещь. спас меня от большой головной боли!
Исаия Ли

33

Смотрите мой случай по другому подобному вопросу :

В моем случае я пытался разобрать пустой JSON:

JSON.parse(stringifiedJSON);

Другими словами, произошло следующее:

JSON.parse("");

2
Да, у меня был и этот! Вы можете легко решить, предоставив вместо {"пустую строку"
cronoklee

1
Я получал пустой json из-за двойной косой черты в URL (например, localhost: 8080 // mypath / blagh), и сервер возвращал пустой ответ на это.
jpierson

1
Я пришел сюда, чтобы подтвердить это решение.
Луис Ассунсао

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

JSHint хорош в поиске местоположения пропущенных скобок или неправильного синтаксиса.


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'); }

Сработало, плюс, вы должны использовать \ "the-text \", так как ссылается на "the-text" также для приведения.
Бей

1

В моем случае я динамически добавлял javascript и дважды использовал двойные кавычки в строковых шаблонах, поэтому я изменил второй на одинарные кавычки, и ошибка исчезла. Я надеюсь, что это поможет некоторым людям, приезжающим сюда по той же причине.


используя addthis, я добавил к URL двойную строку, а затем изменил на одинарную кавычку, и ошибка консоли исчезла
tfa

0

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

Ошибка в обработчике события для (неизвестно): SyntaxError: Неожиданный конец углового таймера ввода JSON

Оказалось, что это из-за плагина «Trans-over» (который переводит слово при нажатии). Возможно, мой ответ кому-нибудь поможет, потому что я ничего не нашел в интернете.


0

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


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.