【问题标题】:Opening Maxmind db in Nodejs在 Nodejs 中打开 Maxmind 数据库
【发布时间】:2017-05-18 05:55:48
【问题描述】:

我正在尝试在我的 nodejs 应用程序中打开 maxmind 开源数据库。我的应用程序从 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});
      }
});
}
});

【问题讨论】:

    标签: node.js maxmind


    【解决方案1】:

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

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

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

    异步读取不会大大加快速度,而且因为加载数据库只完成一次(在应用程序启动期间),我认为它可能会暂时阻塞事件循环一段时间,这没什么大不了的。几秒钟。

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

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

    【讨论】:

    • 嘿!感谢你的回答。一次打开数据库确实工作得更快。!!
    • 想要更快??卸载 maxmind 并在 linux 中加载二进制 mmdblookup 程序。然后让nodeJS简单地运行带有IP地址的控制台命令。将 maxmindlib 加载到您的 linux 控制台并减轻您的 Web 应用程序的负载。 github.com/runk/node-maxmind/wiki/…
    • @indospace.io 我希望你不是建议为每个请求生成一个命令行实用程序?因为这样做的性能会非常糟糕(即使 CLI 实用程序本身很快)。上次我使用 Maxmind 数据库时,我使用了mmdb-reader,它将整个数据库读入内存。非常快,但确实需要相当多的 RAM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2015-10-17
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多