2017-06-16 134 views
0

你好嗎? 我對貓鼬和mongoDB相當陌生,而且在做基本查詢時遇到了麻煩。所以,我有這樣的代碼:貓鼬:正確得到查詢結果

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); 
    }); 
} 

的作品如預期,因爲T發送選我需要返回給請求者:

{ 
    "_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

雖然接受的答案是正確的,我發現使用「異步」模塊,您可以達到所需的結果,如此答案中所述: 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和選舉的回調。當你返回結果時,它還沒有完成執行,因此你的問題。

你可以做的是移動res.json到回調的身體,就像這樣:

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

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

如果我需要在另一個查詢中使用此回調(選舉)的結果會怎麼樣?有沒有辦法等到執行回調來繼續使用代碼? –

+0

你可以看看異步/等待,但它可能是你試圖完成的東西的矯枉過正。 findOne()沒有返回你的查詢結果,你只需要傳入一個回調函數,它會在結果準備完畢時將其回傳。因此,如果您想在執行其餘代碼之前等待它完成,請將剩餘的代碼隨後放入回調的成功部分。就像if(err){console.log(err)} else {//...do rest of stuff}一樣。如果你有很多嵌套的回調函數,你可以看看承諾,但我會先熟悉回調函數吧! – cheesenthusiast

0

的問題是,你沒有使用promise權利。

這是開始學習的好地方約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

謝謝,這很有道理。我結束了使用異步模塊,但會牢記這一點! –