2017-11-17 1 views
1

먼저, 약간 모호한 제목; 나는 하나 더 적절한를 찾을 수 없습니다 : 나는 일부 데이터를 가져 오는 다음 EJS로 렌더링 할 몽구스를 사용하고몽구스 약속의 비동기

시나리오. ,

app.get('/view', function (req, res) { 
    // What I am trying to do    
    User.find({}).exec().then(vals=>{ 
      res.send(vals) 
     }) 

문제점 의도 한대로 위의 코드가 작동

하지만 액세스 코드에 : 내 서버에 파일에서

// Schema 
var UserSchema = mongoose.Schema({ 
    Username: String, 
    City: String 
}) 
// Model 
var User = mongoose.model('User', UserSchema); 

: 그림을 위해, 다음 사항을 고려 다른 파일은 물론 업그레이드를 더 쉽게 만들기 위해 다른 파일을 옮긴 다음 require() 파일을 옮기고 싶습니다.

handler.js

// Promise: Get All Names 
function FetchData(){ 
    return User 
    .find({}) 
    .exec(); 
} 

module.exports = { 
    Get: function(){ 
     val = User.find({}).exec() 
     .then(vals=>{ 
      // Expected to return only after the above is complete 
      return vals 
     }) 
    } 

} 

다음, 내 서버 파일에서 :

var handler = require('handler') 

app.get('/view', function (req, res) { 
    res.send(handler.Get()) 
}); 

불행하게도,이 코드는

내 생각

을 의도 한대로 작동하지 않습니다

필자는 매개 변수를 다양하게하고 코드를 몇 차례 조정했지만 잘못된 점을 파악하지 못했습니다. Get()의 값이 약속이 사용되기 전에 (즉 수수께끼 인) 반환되는 것으로 보입니다.

어떤 도움을 크게 환영받을 것이다 :

+0

당신은 아직 할 수없는 '약속 콜백 내부에서 외부 함수로부터 return' . promise 객체 자체를 반환하고 호출자에서 결과를 '다음'으로 사용해야합니다. 약속은 코드를 동기식으로 만들지 않으며, 미래의 가치를 즉각적으로 제공하지 않습니다! – Bergi

+0

해결 방법이 있습니까? – Isfaaq

+0

아니요. 타임머신을 발명 할 때까지는 해결 방법이 없습니다. – Bergi

답변

0

난 당신이 이런 식으로 뭔가해야한다고 생각 :

module.exports = { 
    Get: function() { 
    return User.find({}).exec() 
     .then(vals => { 
     // Expected to return only after the above is complete 
     return vals 
     }) 
    } 
} 

Get에서 다음 그래서

app.get('/view', function (req, res) { 
    handler.Get().then((response) => { 
    res.send(response); 
    }); 
}); 

, 반환 약속 한 후 사용 그것의 then API.

+0

제안 된 코드가 작동하지 않습니다 : TypeError : 정의되지 않은 'then'속성을 읽을 수 없습니다. – Isfaaq

+0

오류는 'Get'에'return'을 추가하지 않았다는 의미입니다. 또한 업데이트 된 코드를 확인하십시오. – dfsq

+0

문제는 계속 지속됩니다./ – Isfaaq

0

다음은 당신을 도울 코드입니다.

처럼 뭔가에 메인 서버의 파일을 변경

app.get('/view', function (req, res) { 
    handler.Get().then(vals => { 
     res.send(vals); 
    }); 

그리고 handler.js 파일에, 당신은 할 수

module.exports.Get = function(){ 
    return new Promise((resolve, reject) => { 
      User.find({}).exec(function(err, users){ 
       if(!err){ 
        resolve(users); 
       } 
      });  
    }); 
}