在 Nodejs 中打开 Maxmind 数据库
Opening Maxmind db in Nodejs
我正在尝试在我的 nodejs 应用程序中打开 maxmind 开源数据库。我的应用程序从 java 应用程序接收到 IP 地址列表。然后申请returns各个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});
}
});
}
});
您应该只打开数据库一次,然后再使用它。
最简单的解决方案是同步打开文件顶部的数据库:
const maxmind = require('maxmind');
const cityLookup = maxmind.openSync('./GeoLite2-City.mmdb');
异步读取它不会加快很多速度,因为加载数据库只完成一次(在应用程序启动期间),我认为它可能会暂时阻塞事件循环没什么大不了的几秒钟。
并在请求处理程序中使用 cityLookup
函数:
app.post('/endPoint', function(req, res) {
...
let city = cityLookup.get(ip);
...
});
我正在尝试在我的 nodejs 应用程序中打开 maxmind 开源数据库。我的应用程序从 java 应用程序接收到 IP 地址列表。然后申请returns各个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});
}
});
}
});
您应该只打开数据库一次,然后再使用它。
最简单的解决方案是同步打开文件顶部的数据库:
const maxmind = require('maxmind');
const cityLookup = maxmind.openSync('./GeoLite2-City.mmdb');
异步读取它不会加快很多速度,因为加载数据库只完成一次(在应用程序启动期间),我认为它可能会暂时阻塞事件循环没什么大不了的几秒钟。
并在请求处理程序中使用 cityLookup
函数:
app.post('/endPoint', function(req, res) {
...
let city = cityLookup.get(ip);
...
});