尝试在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。
关于为什么会发生这种情况的任何想法?
非常感谢!
答案 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,你也可能会觉得有用。