2017-11-25 3 views
0

Mongo에서 두 개의 개별 콜렉션을 확인하여 전화 번호가 있는지 확인해야합니다. 두 개의 서로 다른 컬렉션에 대한 쿼리를 중첩 할 때 이상한 결과가 발생했습니다.

내가 먼저라는 전역 변수를 만들어 'ownerId'

그때 하나의 컬렉션을 호출 '프로필'에서 찾습니다. 전달한 전자 메일 값이 해당 컬렉션의 문서의 '전자 메일'배열에 있으면 'owner_id'라는 해당 문서의 값으로 만든 'ownerId'변수를 채 웁니다.

나는 하나의 전자 메일 필드가있는 '사용자'라는 다른 컬렉션을 조사합니다. 전달한 전자 메일 값이 해당 컬렉션의 문서에 존재하는 경우 해당 문서의 '_id'로 만든 'ownerId'변수를 채 웁니다.

내 쿼리를 몇 개의 'then()'문에 중첩시켜야합니다. 내가 예상대로

  Profile.findOne({'emails.email_address':req.body.invited_email}, function(err, result){ 

       if(result) 
        ownerId = result.owner_id; 

      }).then(function(){ 
       User.findOne({'email':req.body.invited_email}, function(err, result2){ 

        if(ownerId !== null) 
         ownerId = result2._id; 
       }) 
      }).then(function(){ 

       console.log(' --------------- THIS IS AN EXISTING EMAIL OWNER ID: ' + ownerId); 

      }) 

결과가되지 않습니다 :

여기 내 코드입니다.

'Profile'쿼리가 true이고 일치하는 항목을 찾으면 값으로 ownerId를 콘솔에 기록합니다.

두 번째 '사용자'쿼리가 참이지만 '프로필'과 일치하지 않으면 로그 'null'을 콘솔합니다. 나는 그것이 사용자 결과의 _id 값을 로그하는 것을 기대한다.

누구든지 내 논리에서 오류를 볼 수 있습니까?

답변

0

나는 콜백과 약속을 섞어 놓지 않을 것이다. 이 경우 async/await을 사용하는 것이 좋습니다. 비동기 코드를 동기식으로 만듭니다.

let owner_id; 

try { 
    let profile = await Profile.findOne({ 'emails.email_address': req.body.invited_email }); 
    let user = await User.findOne({ 'email': req.body.invited_email }): 

    if (profile) { 
    owner_id = profile.owner_id; 
    } else if (user) { 
    owner_id = user.owner_id; 
    } else { 
    console.log('no owner id found'); 
    } 
} catch(err) { 
    console.log(err); 
} 

코드는 단지 보통의 약속에 대한 catch() 방법과 같은 오류를 처리하는 시도/캐치에 싸여 예를 들면 다음과 같습니다. await을 사용하는 함수는 async 키워드가 필요합니다.

await은 약속 완료를 기다리는 데 사용됩니다. 콜백이 필요하지 않습니다. 코드가 일반적인 동기식 코드처럼 보입니다.

+0

응답 Mika에 감사하지만 다음과 같은 콘솔 오류가 발생합니다. let profile = await Profile.findOne ({ 'emails.email_address': req.body.invited_email}); ^^^^^^^ SyntaxError : 예기치 않은 식별자 – cnak2

+0

Mongoose 4.x는 약속을 처리하는 .then() 함수가 아니므로 async/await와 함께 몽구스를 사용하기 위해 추가 작업이 필요하지 않습니까? – cnak2

+0

기다리고 있다는 불평입니까? 코드가 주석에 붙여 넣을 때 화살표가 가리키는 부분을보기 어렵습니다. async/await에는 노드 7.6 이상이 필요합니다. 가능한 경우 최신 버전으로 업그레이드해야합니다. 그 다음에 async/await는 약속을 사용하기 때문에 기다리는 것이 더 쉽습니다. – MikaS