2016-11-11 3 views
0

При попытке сделать запрос HTTP в лямбда-функции, следующий GET, кажется, не будет выполнена:Get HTTP не работает в лямбда-функции

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.

Приведенный выше код отлично работает при работе в терминале. Также у меня есть node_modules в библиотеке той же лямбда-функции.

Любые идеи о том, почему это может происходить?

Большое спасибо!

+0

В функции функции обратного вызова (ошибка, ответ, тело) вы можете опубликовать результат «console.log (body)», поэтому мы уверены, что «JSON.parse (body) .balance» - это объект, который на самом деле существует? – MadWard

ответ

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, который дает этот порядок выполнения здесь, увидеть эти ответы:

Это наиболее распространенный тонкий g в узле, который люди путают, и я написал a lot of answers about it, который вы также можете найти полезным.

+0

Спасибо за ваш быстрый ответ. Если я удалю последний console.log(), он также будет отображаться как неопределенный ... – user3302071

+0

@ user3302071 См. Мой обновленный ответ. – rsp

+0

Спасибо за это. Я пробовал это, и он по-прежнему отображается как undefined ... – user3302071

Смежные вопросы