web-dev-qa-db-ja.com

不明なSyntaxError:予期しないトークン:

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();
  });
});
169
trobrock

私は問題を解決しました。標準の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オブジェクトが私に問題を与えている理由を誰かが知っていれば私は知りたいと思うでしょう。

16
trobrock

赤いエラーが見られる

捕捉されなかったSyntaxError:予期しないトークン<

chrome開発者の[コンソール]タブに 301リダイレクト が表示されることがよくありますが、これは.htaccessファイルに奇妙な規則があることが原因である可能性があります。

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

83
andy magoon

同じ問題を抱えているかもしれない人々のためのちょうどFYI - 私はちょうど私のサーバーにJSONをapplication/jsonとして送り返させなければならず、デフォルトのjQueryハンドラはうまく働いた。

78
Edward Abrams

これはちょうど私に起こりました、そしてその理由は上記の理由のどれでもありませんでした。私はjQueryコマンドgetJSONを使用し、JSONPを使用するためにcallback=?を追加し(クロスドメイン化する必要があるため)、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; 
}

うまくいけば、それは将来の誰かに役立つでしょう。

40
Grim...

私は自分の問題と解決策をリストに追加すると思いました。

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

var total = $.parseJSON(response);

私は後でjsonの結果に加えて、私は私のPHPにエラーがあったので、レスポンスと共にHTMLが送信されていることを知りました。 PHPでエラーが発生したときは、巨大なオレンジ色のテーブルについて警告するように設定することができます。それらのテーブルがJSONを捨てていました。

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

10
Keven

JSONファイルを要求すると、サーバーはJSON(Content-Type)の代わりにJavaScriptのtext/javascriptヘッダー(application/json)を返します。

MooToolsのドキュメントによれば

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

その結果、MooToolsはあなたのJSONをJavaScriptとして評価しようとします、そしてあなたがそのようなJSONを評価しようとするとき:

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

javaScriptとして、パーサーはオブジェクト表記ではなくブロックスコープとして{}を扱います。以下の "code"を評価するのと同じです。

"votes":47,"totalvotes":90

ご覧のとおり、:はまったく予想外のものです。

解決策は、JSONファイルに正しいContent-Typeヘッダーを設定することです。 .jsonという拡張子を付けて保存した場合、サーバーはそれを自分で行うべきです。

あなたの反応がどういうわけか評価されているようですね。これはChromeでも同じエラーになります。

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

これは、括弧 '{...}'がjavascriptによってコードブロックとして解釈され、予想されるオブジェクトリテラルではないためです。

JSON.decode()関数を見て、そこにevalがあるかどうかを確認します。

ここで同様の問題: Eval()=予期しないトークン:エラー

3
Zectbumo

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

1
jakob

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

たとえば、/correct/somejsfile.jsを要求したいが、/wrong/somejsfile.jsと入力しなかった場合、要求はサーバーに対して行われます。その場所/ファイルは存在しないので、サーバーは302 location: /#/wrong/somejsfile.jsで応答します。ブラウザは喜んでリダイレクトをたどり、Webページ全体が返されます。ブラウザはページをjsとして解析します。

捕捉されなかったSyntaxError:予期しないトークン<

だから、問題のあるパス/リクエストを見つけるのを助けるために302リクエストを探す。

誰かに役立つことを願っています。

1
Jerinaw

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

ScriptIgnore属性を使用する代わりに、単にDTOを返す方がおそらくよいでしょう。

1
Daryl

" 不明なSyntaxError:予期しないトークン "データが間違った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); 
}

SyntaxError:予期しないトークン 」というエラーが表示される
しかし、間違ったjson形式になった場合
例:

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

または

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

あなたが間違ったJSONフォーマットを得たように、あなたがJSON.decodeまたはJSON.parseの前にそれを修正してください

1
Serip88

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

0
lwdthe1

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

0
JGFMK

JSONでは違法である、InfinityとしてエンコードされたINFの浮動小数点値を逆シリアル化しようとするためにjQuery.getJSON()を使用したときに「SyntaxError: Unexpected token I」が発生しました。

0
Mark Cidade

私の場合、私は私のMVCコントローラで間違ったマッピングのために春のMVCアプリケーションを実行している間、同じエラーに遭遇しました

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

上記のマッピングをに変更しました

 @RequestMapping("/private/updatestatus")

または

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

私はこれを間違えました

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

すでにfs変数を初期化しています。ただし、2行目にvarを追加しています。

0
Jana

何も理にかなっていない場合、このエラーは、以下のように、html/javascriptに埋め込まれているPHP Errorによっても発生する可能性があります。

<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}

PHPによってhtmlに挿入されたコードの<br />などがエラーの原因ではありません 。この種のエラーを修正する(警告を抑制する)ために、最初にこのコードを使用しました

error_reporting(E_ERROR | E_PARSE);

表示するには、ページを右クリックして[ソースの表示]をクリックし、完全なHTMLを調べてこのエラーを見つけます。

0
Hammad Khan

私の場合、それは間違ったURL(存在しない)だったので、2行目の 'send'は他のものであるべきかもしれません...

0
Michal Wrd