2017-07-12 87 views
0

我剛開始使用twitch kraken api,我有幾個問題。獲得NodeJS請求模塊的響應

每當我嘗試獲取JSON對象時都沒有響應。我試圖通過Amazon AWS Lambda運行此功能,並且無法訪問控制檯。

在下面的代碼中,我的回調函數將始終打印出「SUCCESS got streamer 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我沒有想到哈哈。我讓錯誤爲<= 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塊中,並將get/else語句中的if/else語句移入其中。但是,現在我沒有得到任何輸出。

這是怎麼了調用的getJSON方法:

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

上面並執行相同的方法?如在shouldEndSession和回調執行之前getJSON有時間給予迴應?

對於裁判,這是的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); 
     } 
    }); 
}