2017-10-17 6 views
0

Node express와 mongodb를 사용하고 있습니다. 쇼 페이지의 모든 관련 속성을 반복 할 수 있도록 노력하고 있습니다. 내 코드는 밖으로 # 1 console.log 로그 모든 결과 올바른,TypeError : undefined의 'ref'속성을 읽을 수 없습니다. Express

Desktop.find({}, function(err, allDesktop) { 
      if(err){ 
       console.log(err); 
      } else { 
       console.log(allDesktop); // #1 
       res.locals.desktops = allDesktop; // Set the data in locals 
      } 
     }); 
     console.log("res.locals.desktops: ", res.locals.desktops); //#2 

그 코드는 경로의 일부입니다. 그러나 console.log # 2는 undefined을 반환합니다. 왜 이런거야? 나는 똑같은 경로의 다른 지점에서 비슷하게 설정했다는 것을 알고 있지만 대신에 res.locals.laptops

내가 무엇을 놓치고 있습니까?

+0

'Desktop.find'는 동기식 함수이므로 호출 직후 결과를 사용할 수 없습니다. 결과는 콜백에서 사용 가능합니다. 왜냐하면'console.log'의 첫 번째 호출은 정확한 데이터를 출력하지만 두번째'undefined'를 출력하기 때문입니다. – alexmac

+0

'Desktop.find()'가 실행 중입니다 만, db가 결과를 반환 할 때 콜백이 실행되기 전에'console.log()'로 이동합니다 - 반환되기 전에 결과를 출력하려고합니다. 콜백 내에서'console.log()'를 움직이십시오. – doublesharp

답변

1

이 내용은 Event Loop과 관련이 있습니다. 즉, Desktop.find()이 실행되지만이 완료되면 을 알지 못합니다.

콜백이 재생되는 곳은 function(err, allDesktop) {}입니다. Desktop.find() 실행이 완료되면 콜백이 호출됩니다.

따라서 코드는 위에서 아래로 계산되어 res.locals.desktopsundefined이됩니다. 이런 식으로 뭔가가 문제를 해결해야합니다

Desktop.find({}).exec() 
    .then(allDesktop => { 
     res.locals.desktops = allDesktop 
     return Promise.resolve() 
    }) 
    .then(() => { 
     console.log(res.locals.desktops) 
    }) 
    .catch(err => console.error(err)) 

.exec() 본질적으로 PromiseMongooseThenable을 반환합니다.

+0

과제에 오타가 있습니다'allDesktops'은 (는)'allDesktop'이어야합니다 – doublesharp

+0

또한 약속으로 변환 할 필요가 없습니다. 원래 예제와 콜백을 사용하여 똑같은 것을 할 수 있습니다 – doublesharp

+0

@doublesharp 뭐라고 요? 'allDesktop'은 그것이 존재하는 모든 장소에서 똑같습니다. –