2017-07-12 11 views
0

私はちょうどtwitch kraken apiの使用を開始しましたが、いくつか質問があります。NodeJSリクエストモジュールでの応答の取得

JSONオブジェクトを取得しようとするたびに応答がありません。 Amazon AWS Lambdaからこの機能を実行しようとしていますが、コンソールにアクセスすることはできません。

以下のコードでは、コールバック関数は常に「成功したストリーマーエラー」を出力します。私はかなり確信していますが、今度は "ERROR"が私の初期設定結果から来ます。

どうして結果が正しいJSONに変更されないのですか?

私は郵便配達を使用していると、それはクエリとPARAM、およびヘッダで適切なものを返す

function getJSON(callback){ 
    var result = "ERROR"; 
    request.get(url(games[0]),function(error,response,body){ 
     console.log("requested for url: " + url(games[0])); 
     var d = JSON.parse(body); 
     result = d.streams[0];//.channel.display_name; 
     // for(var i = 0; i < limit; i++){ 
     //  streamers.push(d.streams[i].channel.display_name) 
     // } 
     streamers.push(result); 
    }); 
    if (streamers.length < 0){ 
     callback("ERROR"); 
    }else{ 
     callback("SUCCESS got streamers " + result); 
    } 
} 

function url(game){ 
    return { 
     url: "https://api.twitch.tv/kraken/streams/",//twitchlimit, 
     qs : { 
      'game' : 'overwatch', 
      'limit' : 2 
     }, 
     headers: { 
      'Client-ID': clientID, 
      'Accept': 'application/json', 
      'Accept-Charset': 'utf-8', 
     } 
    }; 
} 
+0

あなたの '' 'else'''は' '' request.get'''コールバック – Wainage

+0

ノートに属している...場合に0ストリーマーの長さの配列は必ずしもエラーではありません。誰もストリーミングしていないゲームのストリームを照会すると、空の結果セットが返されます。配列内に0より小さい長さを持つことはできません。 – JBC

+0

ええ、私は笑っていませんでした。エラーを<= 0にしました。それは他のコメントから非同期コードの問題のように思えます – Mszauer

答えて

1

私はあなたの吹流しのコードがあるため

if (streamers.length < 0){ 
    callback("ERROR"); 
}else{ 
    callback("SUCCESS got streamers " + result); 
} 

が要求コールバックに含まれるべきだと思います現在のところ、リクエストが完了するのを待っているわけではありません。ちょうどそれが続くので、resultの値は変更されません。配列の長さは0より小さくすることはできませんので、常にelseに行き、 "成功はストリーマーエラーを返しました"と言うでしょう。

+0

これは私もしばらくしてから考えています。試してみる – Mszauer

0

ありがとうございます。私はいくつかの見落としをして、それらを修正しようとしました。 私はあなたに提案を実装しましたが、それは少し働いたようです。私はjson.parseをtry/catchブロックに置いてしまい、getJSONメソッドの中でif/elseステートメントを移動しました。しかし、今は出力がありません。

function handleGameResponse(intent,session,callback){ 
    //gets the game 
    var game = intent.slots.game.value; 
    if (!games.includes(game)){ 
     var speechOutput = "You asked for: " + intent.slots.game.value; 
     //var speechOutput = "You asked for: " + games[game] + " That game is currently not an option. These are your current options: " + arrayToString(games) 
     var repromptText = "Please ask one from the current options."; 
     var header = "Invalid Game"; 

    }else { 
     getJSON(function(data){ 
      if(data !== "ERROR"){ 
       var speechOutput = data; //capitalizeFirst(game) + " top three streamers are: " + arrayToString(streamers) + '.'; 
       var repromptText = "Do you want to hear more about games?"; 
       var header = capitalizeFirst(game); 
      }else{ 
       var speechOutput = "I'm sorry, something went wrong and I could not get the streamers."; 
      } 
      //speechOutput = data; 
     }); 
     //speechOutput = games[0] + " games[0], game= " + game; //this executes so the getJSON isn't executing 
    } 
    var shouldEndSession = false; 
    callback(session.attributes,buildSpeechletResponse(header,speechOutput,repromptText,shouldEndSession)); 
} 

上記と同じ方法を実行しています:

これは私がgetJSONメソッドを呼び出していますがどのようにでしょうか? shouldJSONが応答を返す時間がある前にshouldEndSessionとコールバックが実行されますか?参照のために

、これはgetJSONメソッドは以下のようになります。

function getJSON(callback){ 
    var result = "ERROR"; 
    request.get(url(games[0]),function(error,response,body){ 
     try{ 
      var d = JSON.parse(body); 
     } catch (err){ 
      callback("Sorry, something seems to have malfunctioned while getting the streamers"); 
     } 
     result = d.streams[0].channel.display_name; 
     // for(var i = 0; i < limit; i++){ 
     //  streamers.push(d.streams[i].channel.display_name) 
     // } 
     streamers.push(result); 
     if (streamers.length <= 0){ 
      callback("ERROR"); 
     }else{ 
      callback("SUCCESS got streamers " + result); 
     } 
    }); 
} 
関連する問題