Async / Await Mongoose并不总是正确运行

时间:2018-05-27 18:39:47

标签: node.js express mongoose async-await

我正在使用mongoose和async / await函数来查询数据库。对api的一些调用不会返回必要的数据。以下是控制器代码

exports.GetAllUrls = async function(req, res, next){
try {
    var urlsArray = []; 
    await Url.find({uid: req.params.uid}, function (err, urls) {
        urls.forEach(function(url){
            urlsArray.push(url);
            console.log(url);
        });
    });
    console.log("Await called");
    return res.status(200).json({reply: urlsArray});
} catch(err) {
    console.log(err);
}

}

在记录网址数据之前,有几次记录了“Await called”。

节点请求日志:

Await called
GET /api/screens/GetAllUrls/0WyaS0ePeaS54zz9cAgCUnxoE1i1 200 31.348 ms - 12
{ _id: 5b0ad7effa8e80800153fa04,
  url: 'https://yahoo.com',
  timestamp: 2018-05-27T16:31:10.638Z,
  uid: '0WyaS0ePeaS54zz9cAgCUnxoE1i1',
  __v: 0 }

如日志中所示,函数似乎在调用await函数之前继续,但我的理解是执行暂停,直到await完成并返回。任何人都有任何想法为什么会这样?

2 个答案:

答案 0 :(得分:4)

我不知道该库或方法的具体细节,但我可以告诉你它为什么不起作用。

"等待"只有当语句的右侧返回" Promise"宾语。在您的代码示例中,似乎该函数需要回调。回调虽然是异步的,但并非承诺。也许您可以查看该库的API文档,看看它是否可以返回Promise而不是回调?

答案 1 :(得分:2)

您正在将回调 async-await 混合使用。不要那样做。请研究它们的工作原理:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

您的路线处理程序应为:

exports.GetAllUrls = async function(req, res, next){
  try {
      const urlsArray = await Url.find({uid: req.params.uid}).exec()
      return res.status(200).json({reply: urlsArray});
  } catch(err) {
      console.log(err);
  }
}
  1. .find()会返回Query个对象:http://mongoosejs.com/docs/api.html#find_find
  2. .exec()返回Promisehttp://mongoosejs.com/docs/api.html#query_Query-exec