在Nodejs中打开Maxmind db

时间:2017-05-18 05:55:48

标签: node.js maxmind

我正在尝试在我的nodejs应用程序中打开maxmind opensource数据库。我的应用程序从java应用程序中获取了一个ip地址列表。然后,应用程序返回与每个ip对应的纬度和经度。我已经成功地同步完成了这个,但我想异步地做这件事以使事情变得更快。我为此编写了一个代码,但应用程序每次都会被杀死。我猜这个原因可能是同时打开同一个数据库(我可能错了:D)。我发布下面的代码。请看一下,并就我出错的地方提出一些建议。感谢!!!

app.post('/endPoint', function(req, res){
var obj = req.body;
var list = [];
var ipList = obj.ipList;
for(var i = 0; i<ipList.length; i++){
var ip = ipList[i];
//console.log(i);
maxmind.open('./GeoLite2-City.mmdb', function(err, cityLookup){
if(err) throw err;
console.log("open database");
var city = cityLookup.get(ip);
if(city!=null){
var cordinates = {'latitude': city.location.latitude, 'longitude': geodata.location.longitude};
        //console.log(cordinates);
        list.push(cordinates);
      }
      if(list.length == ipList.length){
        res.json({finalMap: list});
      }
});
}
});

1 个答案:

答案 0 :(得分:0)

您应该只打开一次数据库,然后重复使用它。

最简单的解决方案是同步打开文件顶部的数据库:

const maxmind    = require('maxmind');
const cityLookup = maxmind.openSync('./GeoLite2-City.mmdb');

异步读取它不会加速一切,并且因为加载数据库只进行一次(在应用程序启动期间),我认为这可能会暂时阻止事件循环几秒钟。

在请求处理程序中使用cityLookup函数:

app.post('/endPoint', function(req, res) {
  ...
  let city = cityLookup.get(ip);
  ...
});