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

193

Я выполняю AJAX-вызов в моем скрипте MooTools, это отлично работает в Firefox, но в Chrome я получаю сообщение Uncaught SyntaxError: Unexpected token :об ошибке, я не могу определить, почему. Комментируя код, чтобы определить, где плохой код ничего не дает, я думаю, что это может быть проблемой с возвращаемым JSON. Проверяя в консоли, я вижу, что JSON вернул это:

{"votes":47,"totalvotes":90}

Я не вижу никаких проблем с этим, почему эта ошибка произошла?

vote.each(function(e){
  e.set('send', {
    onRequest : function(){
      spinner.show();
    },
    onComplete : function(){
      spinner.hide();
    },
    onSuccess : function(resp){
      var j = JSON.decode(resp);
      if (!j) return false;
      var restaurant = e.getParent('.restaurant');
      restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
      $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
      buildRestaurantGraphs();
    }
  });

  e.addEvent('submit', function(e){
    e.stop();
    this.send();
  });
});
trobrock
источник
1
JSON в порядке. Проблема, вероятно, в том, как вы справляетесь с этим. Показ кода поможет.
tcooc
1
Добавил часть кода к вопросу.
Trobrock
В синтаксисе, JS и JSON нет ничего плохого. Поможет опубликование (не) рабочего тестового примера на jsfiddle.net - включая HTML.
Оскар Кравчик
1
В настоящее время я привязываю интернет, поэтому мой модем сжимает исходный код HTML веб-сайтов, которые я просматриваю, поэтому я не могу по-настоящему разбираться в коде. Но для начала поместите каждый код JS во внешние файлы - это всегда облегчает отладку - вы будете знать, что ошибка вызвана JS или чем-то еще.
Оскар Кравчик
2
«Неожиданный токен» - это, вероятно, некоторый недопустимый код символа. Такой код, скорее всего, не будет отображаться при печати на консоли. Поэтому выводите строку по одному символу за раз или используйте анализатор протокола или отладчик и т. Д., Чтобы увидеть действительные байты строки.
GroovyDotCom

Ответы:

94

Видя красные ошибки

Uncaught SyntaxError: Неожиданный токен <

на вкладке консоли разработчика Chrome указывается HTML в теле ответа.

На самом деле вы видите реакцию вашего браузера на неожиданную верхнюю строчку <!DOCTYPE html>с сервера.

Энди Магун
источник
4
Я понятия не имею, почему вы говорите о «неожиданном жетоне <», когда речь идет о вопросе Unexpected token :. Ваш ответ совершенно не связан с проблемой ОП.
Михал Перлаковский
1
И как мне это исправить? У меня есть PHP редирект, который вызывает это в Chrome.
Работает для жизни
7
Чтобы добавить к @andy_magoon, в моем случае у меня был тег сценария, который должен был обслуживать javascript, но поскольку запрос был перенаправлен на страницу HTML (не важно, почему он был перенаправлен), который начинается с <! DOCTYPE html >, который не является допустимым JavaScript, браузер возвращает SyntaxError, когда он пытается проанализировать HTML как JS.
david.barkhuizen
2
@ Thom Способ исправить это - убедиться, что HTTP get возвращает файл javascript, который вы ищете, а не неожиданный HTML.
david.barkhuizen
1
Я получил именно эту ошибку, потому что, как оказалось, путь к файлу неверен, и он не может найти файл, указанный в теге скрипта.
Ньюман
80

Просто FYI для людей, у которых может быть такая же проблема - мне просто нужно было заставить мой сервер отправлять обратно JSON как application / json, и обработчик jQuery по умолчанию работал нормально.

Эдвард Абрамс
источник
4
Я думаю, что у меня есть обратная сторона этой проблемы. Я запрашиваю JSON у стороннего API, и они возвращают application / javascript в качестве ответа, и я получаю ту же ошибку, о которой вы сообщили в этом вопросе. Не уверен, как с этим бороться.
Вуливонг
5
Странная проблема - она ​​отлично работает на локальном хосте, но не на сервере. Есть идеи почему?
VishwaKumar
Привет. У меня есть точная проблема, и я не могу ее решить, может кто-нибудь сказать мне, как вы отправляете JSON обратно на сервер
Ален
Спасибо, я отправлял application / javascript (поскольку я неправильно прочитал это SO ) и получал эту ошибку на простом действующем JSON. Изменив это, чтобы application/jsonустранить ошибку. Я не использую JSONP.
Скипилот
Даже я получаю ту же ошибку "Uncaught SyntaxError: Неожиданный токен:", даже после получения ответа в формате json {"success": true, "data": 2593}
Rupali Pemare
41

Это только что случилось со мной, и причина не была ни одной из причин выше. Я использовал команду jQuery getJSON и добавил callback=?для использования JSONP (так как мне нужно было переходить в другие области), а также возвращал код JSON {"foo":"bar"}и получал ошибку.

Это потому, что я должен был включить данные обратного вызова, что-то вроде jQuery17209314005577471107_1335958194322({"foo":"bar"})

Вот код PHP, который я использовал для достижения этой цели, который ухудшается, если используется JSON (без обратного вызова):

$ret['foo'] = "bar";
finish();

function finish() {
    header("content-type:application/json");
    if ($_GET['callback']) {
        print $_GET['callback']."(";
    }
    print json_encode($GLOBALS['ret']);
    if ($_GET['callback']) {
        print ")";
    }
    exit; 
}

Надеюсь, это поможет кому-то в будущем.

Грим ...
источник
Это мне очень помогло. Мы должны обернуть данные json данными jsoncallback всякий раз, когда мы используем метод jsonp. Также данные jsonpcallback не должны начинаться с цифр. Когда я попробовал с числами, это не сработало. Когда я попробовал его в том же формате, который показан в этом ответе, это сработало ...
Ганеш Бабу
Достаточно верно, но ошибка та же, и код будет изящно ухудшаться и все еще работать, если используется JSON.
Мрачно ...
Это сработало для меня с AJAX, jQuery & JSONP. Большое спасибо!
Петр
16

Я только что решил проблему. Было что-то, что вызывало проблемы со стандартным вызовом Request, поэтому я использовал этот код:

vote.each(function(element){                
  element.addEvent('submit', function(e){
    e.stop();
    new Request.JSON({
      url : e.target.action, 
      onRequest : function(){
        spinner.show();
      },
      onComplete : function(){
        spinner.hide();
      },
      onSuccess : function(resp){
        var j = resp;
        if (!j) return false;
        var restaurant = element.getParent('.restaurant');
        restaurant.getElements('.votes')[0].set('html', j.votes + " vote(s)");
        $$('#restaurants .restaurant').pop().set('html', "Total Votes: " + j.totalvotes);
        buildRestaurantGraphs();
      }
    }).send(this);
  });
});

Если кто-нибудь знает, почему стандартный объект Request доставлял мне проблемы, я хотел бы знать.

trobrock
источник
3
Разница между стандартным запросом и request.json заключается, главным образом, в заголовках, добавляет он this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});- иди на цифру
Димитар Кристофф
Странно, что именно это и стало причиной проблемы с этим.
Trobrock
3
Какие там двойники $$?
falsarella
@DimitarChristoff - любой ответ для фальсареллы о $$?
медведь
1
@bear Селектор двойного доллара определяется в MooTools.
Энтони Фаулл
10

Я думал, что добавлю свою проблему и решение в список.

Я получил: Uncaught SyntaxError: Unexpected token <и ошибка указывала на эту строку в моем заявлении об успехе ajax:

var total = $.parseJSON(response);

Позже я обнаружил, что в дополнение к результатам json был отправлен HTML с ответом, потому что в моем PHP была ошибка. Когда вы получаете сообщение об ошибке в PHP, вы можете установить его, чтобы предупредить вас с огромными оранжевыми таблицами, и эти таблицы были тем, что выбрасывало JSON.

Я узнал об этом, просто сделав console.log(response), чтобы увидеть, что на самом деле было отправлено. Если это проблема с данными JSON, попробуйте посмотреть, можете ли вы сделать console.log или другой оператор, который позволит вам увидеть, что отправлено и что получено.

Keven
источник
1
Я сделал это. Я выводил json где-то в моем php-файле и получал php [// json data] в своем ответе, но я не смог его проанализировать. Спасибо за публикацию, чтобы я мог понять свою ошибку.
Николас Декер
ОП проблема совершенно другая. В вашем случае вы пытаетесь проанализировать HTML как JSON, а в случае OP он пытается проанализировать JSON как JavaScript.
Михал Перлаковский
7

Когда вы запрашиваете ваш JSON-файл, сервер возвращает JavaScript Content-Typeheader ( text/javascript) вместо JSON ( application/json).

Согласно документации MooTools :

Ответы с типом содержимого javascript будут оцениваться автоматически.

В результате MooTools пытается оценить ваш JSON как JavaScript, а когда вы пытаетесь оценить такой JSON:

{"votes":47,"totalvotes":90}

как JavaScript, парсер обрабатывает {и }как область видимости блока вместо нотации объекта. Это то же самое, что вычисление следующего «кода»:

"votes":47,"totalvotes":90

Как вы видете, : совершенно неожиданно.

Решение состоит в том, чтобы установить правильный Content-Type заголовок для файла JSON. Если вы сохраните его с .jsonрасширением, ваш сервер должен сделать это самостоятельно.

Михал Перлаковский
источник
4

Похоже, ваш ответ как-то оценивается. Это дает ту же ошибку в Chrome:

var resp = '{"votes":47,"totalvotes":90}';
eval(resp);

Это связано с тем, что скобки '{...}' интерпретируются javascript как блок кода, а не как литерал объекта, как можно было ожидать.

Я бы посмотрел на функцию JSON.decode () и увидел, есть ли там eval.

Подобная проблема здесь: Eval () = неожиданный токен: ошибка

Zectbumo
источник
2

Если ничего не имеет смысла, эта ошибка также может быть вызвана ошибкой PHP, встроенной в html / javascript, например, приведенной ниже.

<br />
<b>Deprecated</b>:  mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in <b>C:\Projects\rwp\demo\en\super\ge.php</b> on line <b>54</b><br />
var zNodes =[{ id:1, pId:0, name:"ACE", url: "/ace1.php", target:"_self", open:true}

Не то, что <br />в коде, вставленном PHP в html, вызывает ошибку . Чтобы исправить эту ошибку (подавить предупреждение), используйте этот код в начале

error_reporting(E_ERROR | E_PARSE);

Для просмотра щелкните правой кнопкой мыши на странице «Просмотр источника», а затем изучите полный HTML-файл, чтобы определить эту ошибку.

Хаммад хан
источник
1

Появление ошибки « Uncaught SyntaxError: Unexpected token », когда ваши данные возвращают неверный формат json, в некоторых случаях вы не знаете, что получили неправильный формат json.
пожалуйста, проверьте это с предупреждением (); функция

onSuccess : function(resp){  
   alert(resp);  
}

полученное сообщение должно быть: {"firstName": "John", "lastName": "Doe"},
а затем вы можете использовать приведенный ниже код

onSuccess : function(resp){  
   var j = JSON.decode(resp); // but in my case i'm using: JSON.parse(resp); 
}

без ошибки « Uncaught SyntaxError: Unnexpected token »,
но если вы ошиблись в формате json,
например:

... {"firstName": "John", "lastName": "Doe"}

или

Undefined variable: errCapt in .... on line<b>65</b><br/>{"firstName":"John", "lastName":"Doe"}

чтобы у вас был неправильный формат json, исправьте его перед JSON.decode или JSON.parse

Serip88
источник
3
Я рекомендую использовать console.log()вместо alert()отладки.
Михал Перлаковский
1

Это случилось со мной и сегодня. Я использовал EF и возвращал Entity в ответ на вызов AJAX. Виртуальные свойства моей сущности вызывали ошибку циклической зависимости, которая не обнаруживалась на сервере. При добавлении атрибута [ScriptIgnore] к виртуальным свойствам проблема была исправлена.

Вместо использования атрибута ScriptIgnore, вероятно, было бы лучше просто вернуть DTO.

Дэрил
источник
1

Это произошло из-за того, что на моем экспресс-сервере я настроил правило для маршрутизации любых 404 обратно в /#плюс, каким бы ни был исходный запрос. Разрешение углового маршрутизатора / JS для обработки запроса. Если нет js-маршрута для обработки этого пути, /#/whateverна сервер делается запрос, который является просто запросом на/ всей веб-страницы.

Так, например, если я хотел сделать запрос, /correct/somejsfile.jsно я пропустил, набрал его, чтобы /wrong/somejsfile.jsзапрос был сделан на сервер. Это местоположение / файл не существует, поэтому сервер отвечает с 302 location: /#/wrong/somejsfile.js. Браузер успешно выполняет перенаправление, и вся веб-страница возвращается. Браузер анализирует страницу как js, и вы получаете

Uncaught SyntaxError: Неожиданный токен <

Таким образом, чтобы помочь найти неправильный путь / запрос, найдите 302 запроса.

Надеюсь, это поможет кому-то.

Jerinaw
источник
1

У меня была та же проблема, и оказалось, что Json, возвращенный с сервера, не был действительным Json-P. Если вы не используете вызов как междоменный вызов, используйте обычный Json.

Jakob
источник
OP использует JSON, а не JSONP.
Михал Перлаковский
0

Я получил « SyntaxError: Unexpected token I», когда jQuery.getJSON()пытался десериализовать значение с плавающей запятой Infinity, закодированное как INF, что недопустимо в JSON.

Марк Сидаде
источник
1
Этот вопрос о "Неожиданном токене : ".
Михал Перлаковский
0

В моем случае я столкнулся с той же ошибкой при запуске приложения Spring mvc из-за неправильного отображения в моем контроллере mvc

@RequestMapping(name="/private/updatestatus")

я изменил приведенное выше отображение на

 @RequestMapping("/private/updatestatus")

или

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)
Шраван Рамамурти
источник
0

Для меня лампочка загорелась, когда я просмотрел источник на странице внутри браузера Chrome. У меня была дополнительная скобка в операторе if. Вы сразу увидите красный круг с крестом на линии провала. Это довольно бесполезное сообщение об ошибке, поскольку токен Uncaught Syntax Error: Unexpected не ссылается на номер строки, когда он впервые появляется в консоли Chrome.

JGFMK
источник
0

Я сделал неправильно в этом

   `var  fs = require('fs');
    var fs.writeFileSync(file, configJSON);`

Я уже инициализировал fsпеременную. Но снова я вставил varвторую строку. Этот также дает такую ​​ошибку ...

Янен Р
источник
0

Для тех, кто испытывал это в AngularJs 1.4.6 или аналогичной, моя проблема заключалась в том, что angular не нашел мой шаблон, потому что файл по указанному templateUrlмною (пути) не был найден. Я просто должен был обеспечить доступный путь, и проблема ушла.

lwdthe1
источник
Я решил ту же проблему, исправив url baseref - указал на корневую папку => <base href = "/">
Абдеали Чанданвала
0

В моем случае это был ошибочный URL (не существует), поэтому, возможно, ваш 'send' во второй строке должен быть другим ...

Михал - Вереда-нет
источник
0

Моей ошибкой было забыть одинарные / двойные кавычки вокруг URL в JavaScript:

так неправильный код был:

window.location = https://google.com;

и правильный код:

window.location = "https://google.com";
Саид Арианманеш
источник
-2

Uncaught SyntaxError: Неожиданный токен}

Chrome дал мне ошибку для этого примера кода:

<div class="file-square" onclick="window.location = " ?dir=zzz">
    <div class="square-icon"></div>
    <div class="square-text">zzz</div>
</div>

и решил это исправить на клик чтобы быть как

... onclick="window.location = '?dir=zzz'" ...

Но ошибка не имеет ничего общего с проблемой ..

ungalcrys
источник
ОП спросил о «Неожиданном токене : ».
Михал Перлаковский