2017-07-12 3 views
0

Ich habe gerade angefangen mit twitch kraken api und ich habe ein paar Fragen.Antwort bekommen mit NodeJS Anfrage Modul

Immer wenn ich versuche, ein JSON-Objekt zu erhalten, gibt es keine Antwort. Ich versuche, diese Funktion über Amazon AWS Lambda auszuführen, und habe keinen Zugriff auf eine Konsole.

Im folgenden Code wird meine Callback-Funktion immer "ERFOLG wird Streamer FEHLER" ausgedruckt. Ich bin mir ziemlich sicher, dass der "FEHLER" gerade von meiner anfänglichen Ergebniseinstellung herrührt.

Wie wird das Ergebnis nicht in den richtigen JSON geändert?

Ich habe Postbote verwendet, und es gibt die richtige Sache mit der Abfrage und param und Header:

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

Ihre '' ', wenn ... else''' gehört in den' '' request.get''' Rückruf – Wainage

+0

Beachten Sie, dass ein 0 Länge Array von Streamern wäre nicht unbedingt ein Fehler. Wenn Sie nach Streams eines Spiels fragen, in dem niemand streamt, erhalten Sie eine leere Ergebnismenge zurück. Sie können in einem Array niemals eine Länge von weniger als 0 haben. – JBC

+0

ja die <0 ich dachte nicht lol. Ich machte den Fehler <= 0; Es scheint wie ein asynchrones Code-Problem aus den anderen Kommentaren – Mszauer

Antwort

1

Ich denke, Ihre Streamer Code

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

sollte, weil in der Anfrage Rückruf enthalten sein Derzeit wartet es nicht auf die Anfrage zu beenden, es ist nur weiter so der Wert von result wird sich nicht ändern. Auch die Array-Länge kann nicht kleiner als 0 sein, also wird es immer zum else gehen und sagen "ERFOLG bekommen Streamer FEHLER"

+0

das ist, was ich nach einer Weile auch dachte. werde es ausprobieren – Mszauer

0

Vielen Dank für die Vorschläge. Ich hatte ein paar Versehen und versuchte sie zu beheben. Ich habe Sie Vorschläge umgesetzt und es scheint ein wenig funktioniert zu haben. Am Ende habe ich die json.parse in einen try/catch-Block gesetzt und die if/else-Anweisungen in die getJSON-Methode verschoben. Allerdings bekomme ich jetzt keine Ausgabe. Diese

ist, wie ich die getJSON Methode am Aufruf:

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

Ist die oben auf die gleiche Weise durchführen? Wie in der sentEndSession und Callback ausführen, bevor die getJSON Zeit hat, eine Antwort zu geben?

Für ref ist dies die getJSON Methode jetzt:

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