2017-06-16 8 views
0

元気? 私はmongooseとmongoDBにはかなり新しく、基本的なクエリを実行するのに問題があります。 tは私が戻って依頼者に必要な選挙送信するので、Mongoose:質問結果を正しく取得するには

function addVoterToElection(req, res) { 
    let query = Election.findOne({ 'name' : req.body.electionName }); 
    let result = query.exec((err, election) => { 
     if(err) return err; 
     return res.send(election); 
    }); 
} 

意図したとおりに動作します:

{ 
    "_id": "594408b7c94fcdc009000001", 
    "votechain": "594408b7c94fcdc009000002", 
    "name": "eleicaoteste", 
    "electionID": 12, 
    "__v": 0, 
    "voters": null 
} 

をしかし、事は私がそのオブジェクトを使用する必要があるということですので、私はこのコードを持っています他の目的で、query.execから「抽出」するのに問題があります。私は

let query = Election.findOne({ 'name' : req.body.electionName }); 
let result = query.exec((err, election) => { 
    if(err) return err; 
    return (election); 
}); 
res.json(result); 

すべてをすれば、私は戻って取得

{ 
    "emitted": {}, 
    "ended": false, 
    "_events": {}, 
    "_eventsCount": 2 
} 

であり、したがって、私は働いて、この選挙のオブジェクトを持つに依存している次のクエリのためにそれを使用することはできませんよ。私に何ができる?私はこれがかなり基本的な質問であることを知っていますが、約束事がどのように機能するのか分かりません。 ありがとうございました!

+0

受け入れ答えが正しいですが、私が見つけました'async'モジュールを使用すると、この回答に記載されているように望ましい結果が得られます。 https://stackoverflow.com/a/5165153/4148031 –

答えて

-1
let query = Election.findOne({ 'name' : req.body.electionName }); 

let result = query.exec((err, election) => { 
    if(err) return err; 
    return (election); 
}); 

res.json(result); 

クエリは非同期で(バックグラウンドで)実行され、残りのコードは実行されます。クエリが実行されると、errとelectionをとるコールバックを実行します。結果を返すと、まだ実行が完了していないため、問題が発生しています。問題は、あなたがpromise権利を使用していないということです

let query = Election.findOne({ 'name' : req.body.electionName }); 

query.exec((err, election) => { 
    if(err) return err; 
     res.json(election); 
}); 
+0

このコールバック(選挙)の結果を別のクエリで使用する必要がある場合はどうなりますか?コードを続けるためにコールバックが実行されるまで待つ方法はありますか? –

+0

あなたはasync/awaitを調べることができますが、達成しようとしていることはおそらく過剰です。 findOne()はクエリの結果を返していないので、準備ができたら結果をラップするコールバックを渡すだけです。したがって、コードの残りの部分を実行する前に終了するのを待つ場合は、後で実行するコードの残りをコールバックの成功部分に入れてください。 if(err){console.log(err)} else {//...残りのもの}と同様です。あなたがネストされたコールバックをたくさん持っているなら、約束を見ることができますが、まずコールバックを使うことに慣れるでしょう! – cheesenthusiast

0

:あなたは何ができるか

はそうのように、コールバックのボディに移動res.jsonです。

これを約Promisesを学習を開始するには良い場所です:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

ソリューションは非常に簡単です:

let query = Election.findOne({ 'name' : req.body.electionName }); 
let result = query.exec(); 

result.then((result) => { 
    res.json(result); 
}).catch((error) => { 
    // console.log(err); 
}); 

http://mongoosejs.com/docs/promises.html

+0

ありがとう、それは多くの意味があります。私は非同期モジュールを使用して終了しましたが、それを覚えておいてください! –

関連する問題