2017-02-11 12 views
1

私はイベントキャプチャの目的でNodeJSに取り組んでいます。すべてのコールがgetme関数に送られます。この関数から、ipに基づいてGeolocationを返すgetUserLocation()関数を呼び出しています。この値に基づいてグローバル変数を更新するにはどうすればよいですか?Node JS関数のコールバック関数からグローバル変数にアクセスする方法は?

var getClientAddress = function (req) { 
return (req.get('x-forwarded-for') || '').split(',')[0] || req.connection.remoteAddress; 
} 

var getClientLocation = function (ipaddress, callback) { 
    freegeoip.getLocation(ipaddress, function(err, location) { 
     if (err) throw err; 
     return callback(location); 
    }); 
} 

var store = [{'hello': 'world', 'country': 'India', 'City': 'Indupur'}]; 

for (eve=0;eve<store.length;eve++){ 
if(!store[eve].lat){ 
     clientIp = getClientAddress(req); 
     getClientLocation("XXX:XX:XX:XXX", function(resp) { 
      console.log(resp); 
      store[eve].country = store[eve].country || resp.country_name; 
      store[eve].region = store[eve].region || resp.region_name; 
      store[eve].city = store[eve].city || resp.city; 
      store[eve].lat = store[eve].lat || resp.latitude; 
      store[eve].lng = store[eve].lng || resp.longitude; 
     }); 

    } 

しかし、ストアにはアクセスできません。これは未定義です。どのように店舗を更新できますか?

実際のコード:

ここ

https://github.com/Gowtham95india/CapVengine/blob/master/server.js

はエラーメッセージです:

Server started! At http://localhost:8080 
Redis started! Ready to perform 
{ e: '[{"device_id":"dsfkdjf-dsfdls-fejfskj-e2oiej2j3jf","user_id":2124,"email":"[email protected]","event_properties":{"utm_source":"HelloWorld"}, "lat":""}]', 
    v: 2 } 
2017-02-11T09:02:10.838Z 


{ ip: '121.244.122.142', 
    country_code: 'IN', 
    country_name: 'India', 
    region_code: 'MH', 
    region_name: 'Maharashtra', 
    city: 'Phursungi', 
    zip_code: '412308', 
    time_zone: 'Asia/Kolkata', 
    latitude: 18.4667, 
    longitude: 73.9833, 
    metro_code: 0 } 
/Users/GowthamSai/Documents/repo/capeve/server.js:111 
       store[eve].country = store[eve].country || resp.country_name; 
              ^

TypeError: Cannot read property 'country' of undefined 
    at /Users/GowthamSai/Documents/repo/capeve/server.js:111:48 
    at /Users/GowthamSai/Documents/repo/capeve/server.js:36:16 
    at Request._callback (/Users/GowthamSai/Documents/repo/capeve/node_modules/node-freegeoip/lib/freegeoip.js:25:16) 
    at Request.self.callback (/Users/GowthamSai/Documents/repo/capeve/node_modules/request/request.js:187:22) 
    at emitTwo (events.js:106:13) 
    at Request.emit (events.js:191:7) 
    at Request.<anonymous> (/Users/GowthamSai/Documents/repo/capeve/node_modules/request/request.js:1048:10) 
    at emitOne (events.js:96:13) 
    at Request.emit (events.js:188:7) 
    at IncomingMessage.<anonymous> (/Users/GowthamSai/Documents/repo/capeve/node_modules/request/request.js:969:12) 
    at emitNone (events.js:91:20) 
    at IncomingMessage.emit (events.js:185:7) 
    at endReadableNT (_stream_readable.js:974:12) 
    at _combinedTickCallback (internal/process/next_tick.js:74:11) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 
+0

:またによって説明されている問題の根本原因である他の問題のいくつかを、持っている


javascriptのグローバル変数では、キーワード 'var'は関数宣言中に使用されません。ストア変数の宣言中にキーワード 'var'を省略してみてください。 –

+0

どのエラーが表示されますか? – oklas

+0

@SiddharthSrinivasan - 恐ろしいアドバイスです。 Javascriptのすべての変数は明示的に宣言する必要があります。あなたは望みの範囲でそれらを宣言するだけです。暗黙的または偶発的なグローバルは恐ろしい考えであり、厳密なモード(安全なプログラム方法)で実行するとエラーになります。 – jfriend00

答えて

1

あなたの問題はstoreへのアクセスにはない ここでは、実際のコードです。そのグローバル変数が定義されています。

store[eve]にアクセスしています。は決して定義していません。です。

store[eve](例:store[eve] = store[eve] || {})に何も割り当てずに直接store[eve].latを読もうとしています。定義する

一般
+0

私が間違っていない場合、forループ内のインデックス位置の値を保持します。したがって、ストア[eve]は、最初の反復のストアの最初の要素になります。私が間違っているなら私を訂正してください。 –

+0

@ 7H3IN5ID3R - あなたは間違っています。答えの最後にある2つのリンクを参照してください。 'eve'はコールバックが起動する前に更新されます。 – Quentin

+0

はい、あなたは正しいです。イーブ値は1になりました。store [1]は明らかに未定義です。間違いを指摘してくれてありがとう。この場合、これを修正するには良い方法でしょうか? –

関連する問題