2016-10-19 4 views
0

이미지 모델과 사용자 모델이 있습니다. 모든 이미지는 사용자의 user_id 필드를 가지고 있으며 사용자 및 이름의 사진을 가져 와서 이미지 객체에 추가하고 이미지 배열을 반환하려고합니다.몽구스 두 요청에 따라 달라집니다

하나의 이미지에 author_image 필드를 추가하려고 할 때 어떤 오류도 발생하지 않습니다. 그러나 모든 이미지에서 루핑 할 때 appData는 이미지 데이터가 정의되지 않았고 userData가 정의되지 않은 경우 출력이 중단됩니다. 약속을 사용했지만 다시 오류가 발생했습니다. 정의되지 않은 오류없이 수행 할 수있는 최선의 방법은 무엇입니까? 당신이 놓친 무엇

router.route('/images/all') 
.get(function(req,res){ 
var response = {}; 
var imagesData = {}; 
images.find({}).lean().exec(function(err,data){ 
    // console.log(data); 
    imagesData = data; 
    if (!err) { 
     for (var i = 0; i < imagesData.length; i++) { 
      users.find(({'_id': imagesData[i].user_id}),function(err,userData){ 
       console.log(userData); 

      imagesData[i].author_pic = userData[0].profile_image; 
     }); 
     } 

    } 
       res.json(imagesData); 

}); 

}); 

답변

1

find 작업이 동기 작업되지 않는 것입니다. 따라서 모든 find 작업은 즉시 다음 줄로 이동합니다.

이러한 상황을 처리하는 데는 여러 가지 방법이 있지만 약속 (Q library)을 사용하는 경향이 있습니다.

코드는 내가 기본적으로 find가 완료 될 때까지 모든 대기, 단지 다음 실행 Q.all 방법을 사용하고이 경우이

var Q = require('q'); 

var defer = Q.defer(); 
images.find({}).lean().exec(function (err, data) { 
    // console.log(data); 
    imagesData = data; 
    var promiseArr = []; 
    if (!err) { 
     for (var i = 0; i < imagesData.length; i++) { 
      var innerDefer = Q.defer(); 
      users.find(({'_id': imagesData[i].user_id}), function (err, userData) { 
       console.log(userData); 
       defer.resolve(userData[0].profile_image); 

      }); 
      promiseArr.push(innerDefer); 
     } 
    } 
    Q.all(promiseArr).then(function (results) { 
     for (var i = 0; i < imagesData.length; i++) { 
      if (Q.isPromise(results[i])) { 
       results[i] = results[i].valueOf(); 
      } 
      imagesData[i].author_pic = results[i]; 
     } 
     res.json(imagesData); 
    }) 

}); 

과 같을 것이다.

+0

저는 이것을 코드에 넣었습니다. author_pic 값은 다음과 같습니다. "author_pic": { "promise": {}} – Noy

+1

그냥 조건을 입력하고 약속 값을 추출하십시오. 'if (Q.isPromise (result [i])) { results [i] = results [i] .valueOf(); }'Q.all' 안에있는 루프 내부 – hyades

+0

감사합니다. – Noy

관련 문제