使用 NodeJS 请求模块获取响应
Getting response with NodeJS request module
我刚开始使用 twitch kraken api,我有几个问题。
每当我尝试获取 JSON object 时,都没有任何响应。我正在尝试通过 Amazon AWS Lambda 运行 此功能,但无法访问控制台。
在下面的代码中,我的回调函数将始终打印出 "SUCCESS got streamers ERROR"。我现在非常确定 "ERROR" 来自我的初始设置结果。
为什么结果没有变成正确的JSON?
我用过 postman,它 returns 适合查询和参数,headers:
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',
}
};
}
我认为你的主播代码
if (streamers.length < 0){
callback("ERROR");
}else{
callback("SUCCESS got streamers " + result);
}
应该包含在请求回调中,因为当前它没有等待请求完成,它只是在继续,因此 result
的值不会改变。此外,数组长度不能小于 0,因此它将始终转到 else 并说 "SUCCESS got streamers ERROR"
谢谢大家的建议。我确实有一些疏忽并试图修复它们。
我已经实施了你的建议,它似乎有点奏效。我最终将 json.parse 放入 try/catch 块中,并将 if/else 语句移动到 getJSON 方法中。但是,现在我没有得到任何输出。
这就是我调用 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);
}
});
}
我刚开始使用 twitch kraken api,我有几个问题。
每当我尝试获取 JSON object 时,都没有任何响应。我正在尝试通过 Amazon AWS Lambda 运行 此功能,但无法访问控制台。
在下面的代码中,我的回调函数将始终打印出 "SUCCESS got streamers ERROR"。我现在非常确定 "ERROR" 来自我的初始设置结果。
为什么结果没有变成正确的JSON?
我用过 postman,它 returns 适合查询和参数,headers:
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',
}
};
}
我认为你的主播代码
if (streamers.length < 0){
callback("ERROR");
}else{
callback("SUCCESS got streamers " + result);
}
应该包含在请求回调中,因为当前它没有等待请求完成,它只是在继续,因此 result
的值不会改变。此外,数组长度不能小于 0,因此它将始终转到 else 并说 "SUCCESS got streamers ERROR"
谢谢大家的建议。我确实有一些疏忽并试图修复它们。 我已经实施了你的建议,它似乎有点奏效。我最终将 json.parse 放入 try/catch 块中,并将 if/else 语句移动到 getJSON 方法中。但是,现在我没有得到任何输出。
这就是我调用 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);
}
});
}