2017-07-09 15 views
0

変数のスコープに問題があります。私は "要求"の外で "userLocation"にアクセスできる必要があります。私は「userLocation」可変出力にしようとすると、それは代わりにリクエストパッケージから詳細の空の文字列を出力し、スコープの問題(NodeJS - "request"パッケージ)

var request = require('request'); 
var userLocation = ""; 
request('http://ipinfo.io', function(error, res, body) { 
    var ipDetails = JSON.parse(body); 
    userLocation = ipDetails.loc; 
}); 
console.log(userLocation); 

:要求パッケージはhttps://github.com/request/requestで見つけることができることはここでは以下の私のコードです。

答えて

1

これは範囲の問題ではありません。 NodeJSの性質は非同期です。つまり、console.log(userLocation)は実行前にrequestが完了するまで待機しません。それが約束とコールバック関数が存在する理由です。

あなたがuserLocationを印刷したい場合は、そのようにコールバック関数内を移動:あなたは多くを学びたい場合

var request = require('request'); 
var userLocation = ""; 
request('http://ipinfo.io', function(error, res, body) { 
    var ipDetails = JSON.parse(body); 
    var userLocation = ipDetails.loc; 
    console.log(userLocation); 
}); 

このawesome tutorialを見てみましょう。

+0

こんにちは、返信ありがとうございます。 「要求」の値を要求関数外の変数に割り当てる必要がある場合はどうすればよいですか? – dnesbeth

+0

プロミスはあなたのために働くでしょうか? 新しいプロミス((RES、REJ)=> { VARの解決=関数(myReqValue){ RES(myReqValue);} 要求( 'http://ipinfo.io'、関数(誤差、RES 、ボディ){ VAR ipDetails = JSON.parse(本体); するvar userLocation = ipDetails.loc; 解決(userLocation); }); })を((RES)=> { にconsole.log ( "ユーザーの場所:" + res) }); – midnightsyntax

+0

@midnightsyntaxありがとう!それは完璧に働いた。 – dnesbeth