キャッチされないSyntaxError:予期しないトークン:


193

MooToolsスクリプトでAJAX呼び出しを実行していますが、これは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();
  });
});

1
JSONは問題ありません。問題はおそらくあなたがそれをどう扱うかです。コードを表示すると役立ちます。
tcooc

1
質問にコードの一部を追加しました。
trobrock

JSでもJSONでも、構文に問題はないようです。jsfiddle.netに(動作しない)動作するテストケースを投稿すると、HTMLを含めて役立ちます。
Oskar Krawczyk 2010年

1
私は現在インターネットをテザリングしているので、私のモデムは閲覧するWebサイトのHTMLソースを圧縮しているので、コードから実際に表を作成することはできません。ただし、まず第一に、すべてのJSコードを外部ファイルに配置します。これにより、常にデバッグが容易になります。エラーがJSまたは他の何かによって引き起こされていることを知ることができます。
Oskar Krawczyk 2010年

2
「予期しないトークン」は、おそらくいくつかの不正な文字コードです。このようなコードは、コンソールに出力するときに表示されない可能性があります。したがって、文字列を一度に1文字ずつ出力するか、プロトコルアナライザーやデバッガーなどを使用して、文字列の実際のバイト数を確認します。
GroovyDotCom

回答:


93

赤いエラーが表示される

キャッチされないSyntaxError:予期しないトークン<

Chromeデベロッパーのコンソールタブのは、応答本文にHTMLが含まれていることを示しています。

実際に表示されているのは<!DOCTYPE html>、サーバーからの予期しないトップラインに対するブラウザーの反応です。


4
質問がについてのときに「予期しないトークン<」について話している理由がわかりませんUnexpected token :。あなたの答えは、OPの問題とはまったく無関係です。
のMichałPerłakowski

1
そして、どうすればこれを修正できますか?Chromeでこれを引き起こしているphpリダイレクトがあります。
生活のために働く

7
@andy_magoonに追加するには、私の場合、JavaScriptを提供するはずのスクリプトタグがありましたが、リクエストがHTMLページにリダイレクトされたため(リダイレクトされた理由は重要ではありません)、<!DOCTYPE htmlで始まり​​ます>は有効なJavaScriptではないため、ブラウザがHTMLをJSとして解析しようとすると、SyntaxErrorが返されます。
david.barkhuizen 16

2
@Thomこれを修正する方法は、HTTP getが予期しないHTMLではなく、探しているjavascriptファイルを返すことを確認することです。
david.barkhuizen 16

1
結局のところ、ファイルパスが正しくなく、スクリプトタグで指定されたファイルが見つからないため、このエラーが発生しました。
ニューマン2017年

80

同じ問題を抱えている可能性のある人のための参考までに-私のサーバーにJSONをapplication / jsonとして送り返さなければならず、デフォルトのjQueryハンドラーは正常に機能しました。


4
私はこの問題の逆を持っていると思います。サードパーティのAPIからJSONをリクエストしていますが、それらは応答としてapplication / javascriptを返し、この質問で報告したのと同じエラーが発生します。どう対処すればいいかわからない。
ウリウォン

5
奇妙な問題は、ローカルホストでは正常に機能するが、サーバーでは機能しないことです。なぜだと思いますか?
VishwaKumar 2012年

こんにちは。缶誰かがサーバーにJSONの背中を送信する方法を教えて、私は正確な問題を抱えていると私はそれを解決することはできません
アレン

(私がこのSOを誤って読んだため)application / javascriptを送信していて、単純な有効なJSONでこのエラーが発生していたことに感謝します。それを変更してapplication/jsonエラーを解決しました。JSONPを使用していません。
scipilot 2014年

JSON形式{"success":true、 "data":2593}で応答を受け取った後でも、同じエラー "Uncaught SyntaxError:Unexpected token:"が発生します
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; 
}

うまくいけば、将来的に誰かを助けるでしょう。


それは私を大いに助けました。jsonpメソッドを使用するときはいつでも、jsonデータをjsoncallbackデータでラップする必要があります。また、jsonpcallbackデータは数字で始めないでください。数字で試してもうまくいきませんでした。この回答に示されているものと同じ形式で試したところ、うまくいきました...
Ganesh Babu

真実ですが、エラーは同じであり、JSONが使用されている場合、コードは正常に機能し、引き続き機能します。
グリム...

これは、AJAX、jQuery、およびJSONPで私に役立ちました。どうもありがとう!
Piotr Wittchen 2017

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オブジェクトが問題を引き起こしている理由を誰かが知っているなら、知りたいと思います。


3
標準の要求とrequest.jsonとの違いは、主にヘッダに、それが追加されるthis.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});-ゴーフィギュア
ディミタール・クリストフ

それがこれで問題を引き起こしていたのは奇妙なことです。
trobrock 2010

3
$$そこのダブルは何ですか?
falsarella 2012

@DimitarChristoff-$$についてのファルサレラの答えは?
クマ

1
@bearダブルドルセレクターはMooToolsで定義されています。
Anthony Faull 2013

10

問題と解決策をリストに追加したいと思いました。

私は得ていました:Uncaught SyntaxError: Unexpected token <そしてエラーは私のajax成功ステートメントのこの行を指しています:

var total = $.parseJSON(response);

PHPでエラーが発生したため、jsonの結果に加えて、応答とともにHTMLが送信されていることが後でわかりました。PHPでエラーが発生した場合は、巨大なオレンジ色のテーブルで警告するように設定できます。これらのテーブルはJSONをスローしていました。

console.log(response)実際に送信されているものを確認するためにa を実行するだけでそれがわかりました。それがJSONデータの問題である場合は、何が送信され、何が受信されたかを確認できるconsole.logまたはその他のステートメントを実行できるかどうかを確認してください。


1
これは私がしました。私のphpファイルのどこかでjsonをエコーし​​、応答でphp [// json data]を取得していましたが、解析できませんでした。これを投稿してくれてありがとう、私は自分の間違いを理解することができました。
Nicholas Decker 14年

OPの問題は完全に異なります。あなたの場合、HTMLをJSONとして解析しようとしていますが、OPの場合、彼はJSONをJavaScriptとして解析しようとしています。
のMichałPerłakowski

7

JSONファイルをリクエストすると、サーバーはJSON()ではなくJavaScript Content-Typeヘッダー(text/javascript)を返しますapplication/json

MooToolsのドキュメントによると:

javascript content-typeのレスポンスは自動的に評価されます。

その結果、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()=予期しないトークン:エラー


2

何も意味がない場合、このエラーは、以下のように、html / javascriptに埋め込まれているPHPエラーが原因である可能性もあります。

<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形式を取得したことがわかりません。
alert();で確認してください。関数

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:Unexpected token」はあり
ませんが、json形式が間違っている場合は、
ex:

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

または

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

間違ったjsonフォーマットを取得したため、JSON.decodeまたはJSON.parseの前に修正してください


3
デバッグconsole.log()alert()はなくを使用することをお勧めします。
のMichałPerłakowski

1

これは今日も私に起こりました。私はEFを使用していて、AJAX呼び出しに応答してエンティティを返していました。エンティティの仮想プロパティが原因で、サーバーで検出されない循環依存エラーが発生していました。仮想プロパティに[ScriptIgnore]属性を追加することで、問題が修正されました。

ScriptIgnore属性を使用する代わりに、DTOだけを返す方が良いでしょう。


1

これは、Expressサーバーに404をルーティングし/#て元のリクエストが何であったかに加えてルールを設定しているために起こりました。角度ルーター/ jsがリクエストを処理できるようにします。そのパスを処理するjsルートがない場合/#/whateverは、サーバーへのリクエストが行われます。これは/、Webページ全体に対するのリクエストにすぎません。

たとえば、リクエストを作成したいのに/correct/somejsfile.jsタイプミスした場合/wrong/somejsfile.js、サーバーにリクエストが送信されます。その場所/ファイルは存在しないため、サーバーはで応答します302 location: /#/wrong/somejsfile.js。ブラウザはリダイレクトに従い、ウェブページ全体が返されます。ブラウザはページをjsとして解析し、

キャッチされないSyntaxError:予期しないトークン<

したがって、問題のパス/リクエストを見つけるために、302リクエストを探します。

それが誰かを助けることを願っています。


1

同じ問題があり、サーバーから返されたJsonは有効なJson-Pではないことがわかりました。コールをクロスドメインコールとして使用しない場合は、通常のJsonを使用してください。


OPはJSONPではなくJSONを使用します。
のMichałPerłakowski

0

としてエンコードされたの浮動小数点値を逆シリアル化しようとするSyntaxError: Unexpected token Iと、 " "がjQuery.getJSON()返さInfinityれましたINF。これはJSONでは不正です。


1
この質問は「予期しないトークン」に関するものです。
のMichałPerłakowski

0

私の場合、mvcコントローラーのマッピングが間違っているためにSpring MVCアプリケーションを実行しているときに同じエラーが発生しました

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

上記のマッピングを

 @RequestMapping("/private/updatestatus")

または

 @RequestMapping(value="/private/updatestatus",method = RequestMethod.GET)

0

私にとっては、Chromeブラウザ内のページのソースを表示したときに電球が点灯していました。ifステートメントに余分なブラケットがありました。失敗したラインに十字が入った赤い円がすぐに表示されます。キャッチされていない構文エラー:予期しないトークンは、Chromeのコンソールに最初に表示されるときに行番号を参照しないため、これはかなり役に立たないエラーメッセージです。


0

私はこれで間違った

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

すでにfs変数を初期化しましたが、もう一度var2行目に入力しました。これもそのようなエラーを与えます...


0

AngularJs 1.4.6または同様のバージョンでこれを経験している人にとって、私の問題は、私がtemplateUrl提供した(パス)にあるファイルが見つからなかったため、angularがテンプレートを見つけられないことでした。到達可能なパスを提供するだけで問題は解消しました。


baserefのURLを修正して同じ問題を解決しました-ルートフォルダーをポイント=> <base href = "/">
Abdeali Chandanwala


0

私の間違いは、JavaScriptのURLに関する一重引用符または二重引用符を忘れていた

だから間違ったコードは:

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

そして正しいコード:

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

-2

キャッチされない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'" ...

しかし、エラーは問題とは何の関係もありません。


OPは「予期しないトークン」について尋ねました。
のMichałPerłakowski
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.