获取HTTP无法在lambda函数中工作

时间:2016-11-11 22:22:30

标签: node.js http request alexa-skills-kit alexa-skill

尝试在lambda函数中执行HTTP请求时,似乎没有执行以下GET:

    var request = require("request");
    var  myMonzoBalance;

    request({
      uri: "https://api.monzo.com/balance?account_id=acc_XXXXXXXXX",
      method: "GET",
     headers: {'Authorization': 'Bearer XXXXXXX'}
    }, function(error, response, body) {
    myMonzoBalance = JSON.parse(body).balance;
    console.log(myMonzoBalance);        
    });

    console.log(myMonzoBalance);

执行代码后,myMonzoBalance的值将不确定。

实际上,如果我尝试在请求函数中给myMonzoBalance一个值,它将没有任何区别 - undefined。

以上代码在终端中运行时运行正常。此外,我在同一个lambda函数的库中有node_modules。

关于为什么会发生这种情况的任何想法?

非常感谢!

1 个答案:

答案 0 :(得分:0)

这是执行的顺序:

1 var request = require("request");
2 var  myMonzoBalance;

3 request({
  uri: "https://api.monzo.com/balance?account_id=acc_XXXXXXXXX",
  method: "GET",
 headers: {'Authorization': 'Bearer XXXXXXX'}
}, function(error, response, body) {
5 myMonzoBalance = JSON.parse(body).balance;
6 console.log(myMonzoBalance);        
});

4 console.log(myMonzoBalance);

不是在函数外部未定义的情况。当您运行最终console.log()时,它尚未定义尚未

当然,您也可能没有得到请求的任何响应(您通过在回调函数中运行console.log(body)而不是console.log(myMonzoBalance)来测试它)但即使您收到响应并且它有一个余额字段,然后在您的代码的最后一行打印值后,此行myMonzoBalance = JSON.parse(body).balance仍会运行。

解决问题的第一步是更改代码以确保获得正确的响应:

var request = require("request");
var  myMonzoBalance;

request({
  uri: "https://api.monzo.com/balance?account_id=acc_XXXXXXXXX",
  method: "GET",
 headers: {'Authorization': 'Bearer XXXXXXX'}
}, function(error, response, body) {
  if (error) {
    console.log('ERROR:', error);
  } else {
    console.log('BODY:', body);
    console.log('BALANCE:', JSON.parse(body).balance);
  }
});

并且只有在打印出您需要的内容时才尝试修复计时问题。

为了更好地理解在此处执行此执行顺序的Node的异步性,请参阅以下答案:

这是Node中最常见的事情,让人感到困惑,我写了a lot of answers about it,你也可能会觉得有用。