首页 > 解决方案 > Async/Await Mongoose 并不总是正确运行

问题描述

我正在使用带有异步/等待功能的猫鼬来查询数据库。对 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);
}

}

有几次在记录 url 数据之前记录了“等待调用”。

节点请求日志:

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 完成并返回。有人知道为什么会这样吗?

标签: node.jsexpressmongooseasync-await

解决方案


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

只有当语句的右侧返回“Promise”对象时,“await”才会暂停。在您的代码示例中,该函数似乎需要一个回调。回调虽然是异步的,但不是承诺。也许您可以检查该库的 API 文档以查看它是否可以返回 Promise 而不是接受回调?


推荐阅读