2017-05-18 6 views
0

私のnodejsアプリケーションでmaxmind opensourceデータベースを開こうとしています。私のアプリケーションは、JavaアプリケーションからIPアドレスのリストを受信します。アプリケーションは、各ipに対応する緯度と経度を返します。私はこれを同期的に行ってきましたが、私は非同期的にやりたいことを少し速くしたいのです。私はこれのためのコードを書いたが、アプリケーションは毎回殺される。私は、その理由が同じデータベースの同時オープン(私は間違っているかもしれない:D)かもしれないと推測しています。私は以下のコードを投稿しています。それを見て、私が間違っている場所についていくつかの提案をしてください。ありがとう!!!NodejsでMaxmindを開く

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

は、それが非同期で全体の多くを、物事をスピードアップし、データベースをロードすることは行われているためではないでしょう読みます(アプリケーションの起動時に)1回だけ、イベントループを数秒間ブロックすることは大したことではないと私は思います。

そして、あなたの要求ハンドラでcityLookup機能を使用します。

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

ねえ!!答えに感謝します。データベースを一度に開くだけで、実際にはもっと速く動作しました。 –

関連する問題