1

尝试在 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 一个值,它不会有任何区别 - 未定义。

上面的代码在终端中运行时工作正常。我在同一个 lambda 函数的库中也有 node_modules。

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

非常感谢!

4

1 回答 1

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

它不是在函数之外未定义的情况。当您运行 final 时,它还没有定义console.log()

当然也有可能你没有从请求中得到任何响应(你通过运行console.log(body)而不是console.log(myMonzoBalance)在回调函数中测试它)但是即使你得到响应并且它有一个 balance 字段,那么这条线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 中最容易混淆的事情,我已经写了很多关于它的答案,您可能也会觉得有帮助。

于 2016-11-11T22:27:16.687 回答