2017-05-17 6 views
0

jsとnode.jsがかなり新しくなっていますが、APIへの呼び出しと必要な情報の取得ができました。しかし、私が次の情報を入手するためにバッターIDを引き上げようとしていたとき。私は正常に動作するように未定義のエラーチェックを成功させました。しかし、私は非同期関数ですぐに何かを実行しようとしていたので、ループスルーできませんでした。私は今、各実行後に2秒の遅延で関数asyncを全部作ってみようとしていますが、次のエラーを返しています(何かが未定義であると仮定しています)JSONの位置0の予期しないトークンuが非同期のために機能しない

**注: i = 4およびp = 1の場合、値はAPIデータに存在します。しかし、私はこのコードを使用してそれらの値で開始しようとすると、このエラーが発生します。

エラー:

Unexpected token u in JSON at position 0 

これは私のコードです:

request('API Info redacted', 
     setTimeout (function (err, response, body) { 

     //do stuff below 
     //to get the first play of the game, set i=1 and p=0 
     var i = 4; 
     var p = 1; 
     // ************ 
     var boolIn = 1; 

     // parse the body as JSON 
     var parsedBody = JSON.parse(body); 
     var apiResults = parsedBody.apiResults; 

     if(typeof(apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p]) == 'undefined') { 
      //sets the variables to the first batter of the next inning 
      p=0; 
      i = i+1; 
     } 

     //below pulls the apiResults from the body of the API request 
     var sportId = apiResults.sportId; 
     var hitName = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].name; 
     var fname = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].batter.firstName; 
     var lname = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].batter.lastName; 
     var outsB = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].outs.before; 
     var outsA = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].outs.after; 
     var rbis = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].runsBattedIn; 
     var outDifference = (outsA - outsB); 
     var hitB = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].baseSituation.beforeId; 
     var hitA = apiResults[0].league.season.eventType[0].events[0].pbp[i].pbpDetails[p].baseSituation.afterId; 
     var baseDifference = (hitA - hitB); 


     //prints the details pulled above 
     res.json("First Name: " + fname + ", Last Name: " + lname + ", Hit name: " + hitName + ", Outs on the play: " + outDifference + ", Rbi's: " + rbis + 
     ", Base Sit: " + baseDifference); 

     //increases the batter call 
     p = p+1; 

     //below ends the setTimeout 
     }, 2000)); 

     //ended request 
    }); 
+3

構成しているものが有効なJSON文字列ではないためです。 FYIあなたは 'res.json'にJSオブジェクトを渡すことができます。(それはあなたのためにそれを文字列化します)(https://expressjs.com/en/4x/api.html#res.json)、そうするのが簡単かもしれませんあなたの場合。 – George

+0

@ George私はそれを非同期的に変更する前に、この変更を印刷したときに何が起こったでしょうか? 1回の実行でpとiの値を実行したときに、エラーなしで意図したとおりに印刷されたため – dgelinas21

答えて

2

setTimeoutは、それが呼び出す関数に引数を渡すないので、bodyundefinedです。これをJSON.parseに渡すと、有効なJSONテキストではない文字列"undefined"に変換されます。

あなたのコードはどこにもあなたのプログラムに入って来ることを示していますか(またはそれに埋め込まれています)。 JSONを解析して解析する必要があります。

+0

bodyにjsonがありますが、setTimeoutを使用して引数を渡すことができない場合は、どのように修正されますか?すべてを非同期で実行し、リクエスト内でbodyをパラメータとして取る別個の関数を作るのが最善でしょうか? – dgelinas21

関連する問題