2017-05-18 5 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

이봐! 답변 해주셔서 감사합니다. 데이터베이스를 한 번 열면 정말 빨리 작동했습니다. !! –