2017-06-16 90 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

谢谢,这很有道理。我结束了使用异步模块,但会牢记这一点! –