2017-03-14 13 views
0

APIとやりとりするためのファイルを使用しています。まず、APIが検索フォームを作成するためにHTMLとJavascriptを送信すると、APIはその検索フォームのクエリを処理できます。エラー:AJAX応答内のAJAX呼び出し

私は2番目のリクエストにいくつかの問題があります。これは最初のリクエストの成功関数内で呼び出されます(これは問題だと思われます)。ここで私が作業しているコードです。

$.ajax({ 
    type: "POST", 
    url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy", 
    crossDomain: true, 
    data: JSON.stringify({ 
    "stage": "load", 
    "fields": ["first_name", "last_name", "graduation_year"] 
    }), 

    success: function(response) { 
    response = JSON.parse(response); 
    $(response.html).prependTo("#content"); 
    $(response.scripts).appendTo("body"); 
    }, 

    complete: function() { 
    //get field inputs 
    var fieldInput = { 
     "first_name_query": "", 
     "last_name_query": "", 
     "graduation_year_query": "" 
    }; 

    $('form').find('input[type=search]').each(function(index, value) { 
     var variableName = value.name; 
     var fieldId = "#" + value.name; 

     $(fieldId).keyup(function() { 
      variableName = $(this).val(); 
      fieldInput[value.name + "_query"] = variableName 
      console.log(value.name + ":" + fieldInput[value.name + "_query"]); 
     }) 
     .keyup(); 
    }); 

    $('#search_form').submit(function(event) { 
     event.preventDefault(); 
     $.ajax({ 
     type: "POST", 
     url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy", 
     data: JSON.stringify({ 
      "stage": "search", 
      "fields": ["first_name", "last_name", "graduation_year"], 
      "query": { 
      "first_name": fieldInput["first_name_query"] 
      } 
     }), 

     success: function(response) { 
      response = JSON.parse(response); 
      console.log(response); 
     } 
     }); 

    }) 

    } 
}); 

応答を解析しようとすると、予期しないトークンが発生します。このコードを次のような最初のAjaxリクエスト以外で実行した場合:

$.ajax({ 
    type: "POST", 
    url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy", 
    data: JSON.stringify({ 
    "stage": "search", 
    "fields": ["first_name", "last_name", "graduation_year"], 
    "query": { 
     "first_name": "Bob" 
    } 
    }), 


    success: function(response) { 
    response = JSON.parse(response); 
    console.log(response); 
    } 
}); 

私は問題はなく、コードは正常に実行されます。だから問題は、別の成功の応答の中で1つのAjax呼び出しを実行しているようですが、私は理由を知らないのですか?おそらく別のやり方をしているかもしれませんが、なぜこれがうまくいかないのか誰かが洞察力を持っているかどうかを見たいと思っていました。

+1

デリゲートされたバインドはどうしてですか? - http://api.jquery.com/on/#direct-and-delegated-events – Pete

+0

JSONの場合、jQueryはオブジェクトにします.... – epascarello

答えて

2

あなたが取得しているエラーは、あなたが応答が第二ケース

内の文字列を明示的に変換する代わりになっていることを確認しています

var x = {} 
console.log(x.toString()) //> [object Object] 
JSON.parse(x) 
// Uncaught SyntaxError: Unexpected token o in JSON at position 1 
// at JSON.parse (<anonymous>) 
// at <anonymous>:3:6 

以来 JSON.parse でオブジェクトを解析しようとしていることを示唆していますJSONはjqueryのは、だから、 dataType: 'json'

$.ajax({ 
    type: "POST", 
    url: "https://vq3rsgkd94.execute-api.us-east-1.amazonaws.com/deploy", 
    data: JSON.stringify({ 
    "stage":"search", 
    "fields":["first_name","last_name","graduation_year"], 
    "query":{"first_name": fieldInput["first_name_query"] } 
    }), 
    dataType: 'json' 
)} 
+0

実際にブレークポイントを設定してconsole.logを実行すると、レスポンス)、私は、オブジェクト{errorMessage: "予期しないトークン"、errorType: "SyntaxError"、stackTrace:Array [0]} –

+0

を取得し、console.log(response.toString())を実行すると、[オブジェクトオブジェクト]私の元のエラーを説明します –

+0

私はdataTypeを設定しようとしました: 'json'と何も変更されません。 –

1

PRであなたのためにそれを解析することができますオベレムはかなり奇妙に終わった。私はNationbuilderプラットフォームのためのAPIを開発しています(おそらく私の最初の間違いでしょう)。不明な理由で、Nationbuilderは、私のLAMBDAベースのAPIが解析できなかったすべての要求に真正性トークンを追加していました。ちょうど他の誰かが私と同じ非常に小さなボートに入っている場合には、POSTリクエストの代わりにGETリクエストを使用してしまい、Nationbuilderが真正トークンの追加をやめました。

また、誰かがラムダを使用している場合、私はデジタルオーシャンホステッドエクスプレスJSに切り替えることになってしまい、もっと幸せです。

+0

私はあなたと同じ非常に小さいボートにいます。どのような奇妙なことを行う。 Nationbuilderは役に立たない。 – ReactingToAngularVues

+0

笑それは分かった? –

+1

私はしました!だから、Nationbuilderは液体テンプレートエンジンを使います。そこには、各ページに含まれている縮小されたファイルがあります。このページには、beforeSend' jQueryが提供するAJAXイベントハンドラがバインドされています。 このイベントハンドラは、リクエストがクエリ文字列かオブジェクトかを検出し、それぞれのリクエストに真正性トークンをそれぞれ追加、追加、追加します。しかし、チェックは素朴です:JSONオブジェクトをリクエストの本体として文字列化すると、beforeAndイベントが呼び出される前に発生します。チェックが行われる頃には、あなたの(1/2) – ReactingToAngularVues

関連する問題