2016-11-11 5 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にリクエスト関数内の値を渡そうとすると、違いはありません。未定義です。

ターミナルで実行すると、上記のコードは正常に動作します。また、同じlambda関数のライブラリ内にnode_modulesがあります。

これがなぜ起こっているのかについてのアイデアはありますか?

多くの感謝!

+0

コールバック関数関数(error、response、body)では、 "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(myMonzoBalance)の代わりにconsole.log(body)を実行して猫をテストします)が、レスポンスを得てもバランスフィールドがある場合でもこの行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); 
    } 
}); 

、それはあなたがタイミングの問題を解決しようとする必要があるものを印刷した場合にのみ。

は、ここで、この実行順序を与えているノードの非同期性のより良い理解を得るためには、それらの回答を参照してください。

これは最も一般的な薄いですあなたはまた役に立つかもしれないa lot of answers about itを書きました。

+0

ご返信ありがとうございます。最後のconsole.log()を削除した場合は、未定義として表示されます... – user3302071

+0

@ user3302071更新された回答をご覧ください。 – rsp

+0

ありがとうございます。私はそれを試みましたが、それはまだ未定義として表示されます... – user3302071