2017-02-20 15 views
0

約束事のためのmongooseとQの使用。しかし、結果は正しいデータを返すマングースの約束と空{}Node.JS Q promiseでのmongooseリクエストreturn empty {}

var Q = require("q"); 

var deferred = Q.defer(); 

User.find({}, function (err, users) { 
    if (err) { 
     deferred.reject(next(err)); 
    } else { 
     deferred.resolve(users); 
    } 
}); 

return deferred.promise; 

同じ要求であるが、完全な奇妙な秩序を持っています

console.log("Label 1"); 
console.log("Label 2 Users = " + getUsers()); 
console.log("Label 3"); 

... 

getUsers = function(next) { 
    User.find({}).exec(). 
     .then(function (err, users) {(
      if (users) { 
       console.log("Label 4 Users = " + JSON.stringify(users)); 
       return user; 
      } 
     )} 
     .catch(err) { 
      return next(err); 
     }); 
} 

結果:

ラベル1 - >ラベル2 - > [ユーザー]を=未定義 - >ラベル3 - >ラベル4ユーザー= {...}

Node.Js v7.5; mongoose v4.8.3; q v1.4.1

間違いはどこですか?どのようにして私は関数でmongooseを呼び出すことができますか?あなたはマングースのv4.8.3を使用している場合

+0

のですか?私が見ているのは、次の(誤り)です。また、最初にmongoosesを約束して使うのはなぜですか? –

答えて

0

マングースの約束を使用し、任意のより多くのqを必要としません。 「非同期」とは、結果がすぐに利用できないことを意味します。

getUsers = function(next) { 
    // v---- here 
    return User.find({}).exec(). 
     .then(function (err, users) {(
      if (users) { 
       console.log("Label 4 Users = " + JSON.stringify(users)); 
       return users; 
      } 
     )} 
     .catch(err) { 
      return next(err); 
     }); 
} 

そしてそれを待つ:あなたの関数からの約束を返す(そして、あなたのタイプミスを修正)する必要があり、あなたのコールバックはどこを

getUsers().then(function (users) { 
    console.log("Label 1"); 
    console.log("Label 2 Users = " + users); 
    console.log("Label 3"); 
}); 
1

あなたは非同期実行の概念を把握しているようには見えません直接

User.find({}) 
    .then((user) => { 
     console.log(users); 
    }) 
    .catch((err) => { 
     console.error(err); 
    });