节点的JS如何从一个函数的callback函数访问全局variables?

我正在使用NodeJS进行事件捕获。 所有的电话都将来到getmefunction。 从这个函数我打电话getUserLocation()函数返回基于IP地理定位。 如何根据这个值更新全局variables?

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":"gowtham95india@gmail.com","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) 

你的问题不是访问store 。 该全局variables已定义。

你的问题是访问store[eve]因为你从来没有定义

你直接去试图阅读store[eve].lat而不用指定任何东西来store[eve] (例如store[eve] = store[eve] || {} )。


您还有其他一些问题,这是问题的根源,解释如下:

  • 如何返回来自asynchronous调用的响应?
  • 循环中的JavaScript闭包 – 一个简单实用的例子