2016-07-07 6 views
0

여러 Mongodb 콜렉션에서 데이터를 검색하고 나열해야하는 페이지를 작성 중입니다. 익스프레스 라우터 기능에서 별도의 쿼리를 수행 한 다음 각 섹션의 관련 데이터에 액세스하는 페이지로 전달되는 배열로 결과를 무시합니다. 지금까지 최대 세 개의 쿼리로는 정상적으로 작동했지만 네 번째 쿼리를 추가하면 오류가 발생합니다.Mongo/Express/Node에서 다중 콜렉션을 검색 할 때 오류가 발생했습니다.

라우터 기능은 다음과 같다 :

(더미 컬렉션 이름을 사용)
router.get('/thetest',function(req,res){ 
    var finalResult = {}; 
    var MongoClient = mongodb.MongoClient; 
    var url = 'mongodb://localhost:27017/myapp'; 
    MongoClient.connect(url, function(err, db){ 
     if(err){ 
      console.log("Connection Error",err); 
     }else{ 
      var collection = db.collection('cats'); 
      collection.find({}).toArray(function(err,result){ 
       if(err){ 
        console.log("Error retrieving cats"); 
       }else if (result.length){ 
        finalResult.ctlist = result; 
        console.log("cats OK"); 
       } 
      }); 
      var collection = db.collection('mice'); 
      collection.find({}).toArray(function(err,result){ 
       if(err){ 
        console.log("Error retrieving mice"); 
       }else if (result.length){ 
        finalResult.mclist = result; 
        console.log("mices OK"); 
       } 
      }); 

      var collection = db.collection('cheese'); 
      collection.find({}).toArray(function(err,result){ 
       if(err){ 
        console.log("Error retrieving cheese"); 
       }else if (result.length){ 
        finalResult.chlist = result; 
        console.log("Cheese OK"); 
       }else{ 
        console.log('No Documents'); 
       } 

      }); 
      var collection = db.collection('mice'); 
      collection.find({}).sort({tailLength:1}).limit(3).toArray(function(err,result){ 
       if(err){ 
        console.log("Error retrieving alert bookings"); 
       }else if (result.length){ 
        finalResult.mtlist = result; 
        console.log("Mouse tail length ok"); 
        res.render('thetest',{ 
         "thelist":finalResult 
        }); 
       } 
       db.close(); 
      }); 
     } 
    }); 
}); 

따라서 세 개의 다른 그룹으로 이루어진 네 개의 질의가있다. 결과는 각 루프를 사용하여 Jade 템플릿에 나열됩니다.

네 개의 쿼리 중 하나를 주석 처리하고 다른 세 개의 쿼리를 실행하면 잘 작동합니다. 결과가 페이지에 나열됩니다. 4 개의 쿼리를 모두 주석 처리하고 실행하면 노드가 중단되고 페이지에 아무 것도 표시되지 않습니다. 컬렉션 중 어느 것도 크기가 약 6 개가 넘지 않으며 각각에 몇 개의 필드가 있습니다.

나는이 모든 것을 처음 접했고, 이것이 내가 시도하고있는 일을하는 가장 좋은 방법이 아닐 수도 있다는 것을 이해한다.

누구든지 내가 잘못 가고있는 곳을 설명 할 수 있습니까? 그리고/또는 b) 더 나은 접근 방식을 제안 할 수 있습니까?

감사

답변

2

문제는 귀하의 코드로 인한 것 같습니다.

Node.js는 비동기 프로그래밍 언어이므로 모든 작업이 병렬로 작동합니다.

코드에서 'db.close();' 데이터베이스 연결을 닫으십시오. 예를 들면. 모든 DB 작업이 병렬로 작동하고 네 번째 작업 (코드에서)이 먼저 실행되면 데이터베이스 연결이 닫힙니다. 따라서 좋은 프로그래밍 스타일이 아닙니다.

그래서 이것을 해결하기 위해 'async'라이브러리를 사용할 수 있습니다. https://github.com/caolan/async

샘플 코드 : 내가 말한대로 내가 그대로 된 THe4 쿼리의 3, 어떤 댓글을 달았습니다 코드 블록 밖으로 res.render() 함수를 이동했습니다 그것은 그 아니다

async.parallel([ 
    function(callback){ 
    dbOperation1(query, callback); 
    }, 
    function(callback){ 
    dbOperation2(query2, callback); 
    }, 
    function(callback){ 
    dbOperation3(query3, callback); 
    }, 
    function(callback){ 
    dbOperation4(query4, callback); 
    } 
], 
function(err, results){ 
    if (err) { 
    renderError(err); 
    } else { 
    renderHTML(results[0], results[1], results[2], results[4]); 
    } 
}); 
+0

나는 내 코드에 대해 당신이 맞다고 생각한다. 나는 최근에 mongodb로 node.js를 배우려고 시작했으며 많은 시행 착오를 반복하고있다. 어디에서 render 함수와 db.close 함수를 넣을까요? 아니면 이걸할까요? 그런 새내기가되어서 미안 해요 – Drum

+0

모든 작업을 끝낸 후에 render 함수를 넣으십시오. 즉, 콜백 함수입니다. –

+0

아직이 부분을 아직 완전히 이해하지 못했지만 올바른 방향으로 나를 놓았 기 때문에 다시 들어가서 시도하고 배우게됩니다. 감사합니다. – Drum

0

당신이 네 가지 조건을 언급하는 경우는 당신이 res.render('thetest',{ "thelist":finalResult });

는 따라서 코드가 초킹 (chock)되는 주석 것을 확신합니다. 익스프레스 API는 항상 응답을 기다리고 응답 문장을 제공하지 않으면 잠시 기다린 다음 충돌이 발생합니다.

해결 방법 : 응답 문을 조건 외로 작성해야합니다.

+0

그 괜찮아. 4 번째를 추가하면 모든 것이 넘어집니다. – Drum

+0

죄송합니다.하지만 문제가 발생하지 않습니다. 네 번째 컬렉션을 추가하면 충돌 할 것입니다. 당신은 그것이 잘 작동 할 때 어떤 의견을 말해 줄 수 있습니까? –

+0

네, 맞습니다! 나는 아침마다 무슨 일이 일어나고 있는지 궁금해했습니다. 3 개의 쿼리 중 아무 것이나 괜찮으므로 구문 오류 일 수는 없지만 4 번째를 추가 할 수는 없습니다. 페이지에서 여러 컬렉션의 데이터를 가져 오는 것이 가장 좋은 방법일까요? 그밖에 어떻게 할 수 있습니까? – Drum

관련 문제