【问题标题】:Mongoose: properly getting the query resultMongoose:正确获取查询结果
【发布时间】:2017-11-19 13:07:22
【问题描述】:

你好吗? 我对 mongoose 和 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
}

因此我无法将它用于下一个依赖于让这个选举对象工作的查询。我能做些什么?我知道这是一个相当基本的问题,但我不确定我是否理解整个承诺的工作原理。 非常感谢!

【问题讨论】:

标签: javascript node.js mongodb express mongoose


【解决方案1】:

问题是你没有使用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

【讨论】:

  • 谢谢,这很有意义。我最终使用了异步模块,但请记住这一点!
【解决方案2】:
let query = Election.findOne({ 'name' : req.body.electionName });

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

res.json(result);

查询异步运行(在后台),而您的其余代码执行。当查询完成执行时,它执行接受错误和选举的回调。当您返回结果时,它还没有完成执行,因此您的问题。

您可以将 res.json 移动到回调的主体,如下所示:

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

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

【讨论】:

  • 如果我需要在另一个查询中使用这个回调(选举)的结果怎么办?有没有办法等到回调执行后再继续代码?
  • 您可以查看 async/await ,但对于您要完成的工作而言,这可能有点矫枉过正。而且 findOne() 不会返回您的查询结果,您只需将一个回调传递给它,当它准备好时将其包裹起来。因此,如果您想在执行其余代码之前等待它完成,只需将您想要执行的其余代码放在回调的成功部分中即可。就像 if (err) { console.log(err) } else { //...do rest of stuff } 一样。如果你有很多嵌套的回调,你可以查看 Promise,但我会先熟悉使用回调!
猜你喜欢
  • 2021-04-29
  • 2014-05-12
  • 1970-01-01
  • 2020-09-22
  • 2019-11-08
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多