2017-05-18 103 views
0

我想在我的nodejs应用程序中打开maxmind opensource数据库。我的应用程序接收来自Java应用程序的IP地址列表。应用程序然后返回对应于每个IP的经度和纬度。我已经成功完成了这个同步,但我想异步做它使事情变得更快一点。我为此编写了一个代码,但应用程序每次都会被终止。我猜测,原因可能是同时打开同一个数据库(我可能是错的:D)。我张贴下面的代码。请看看它,并就我的错在哪里提出一些建议。谢谢!!!在Nodejs中打开Maxmind db

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}); 
     } 
}); 
} 
}); 

回答

0

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

最简单的解决办法是同步你的文件的顶部打开数据库:

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

阅读它异步不会加快东西一大堆,而且由于装载数据库完成只有一次(在应用程序启动过程中),我认为这可能会暂时阻止事件循环几秒钟,这不是什么大事。

而在你的请求处理程序使用cityLookup功能:

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

嘿!感谢你的回答。通过一次打开数据库,它确实运行得更快。 –