【问题标题】:Async/Await Mongoose doesn't always run correctlyAsync/Await Mongoose 并不总是正确运行
【发布时间】:2018-11-06 09:30:57
【问题描述】:

我正在使用带有异步/等待功能的猫鼬来查询数据库。对 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 完成并返回。有人知道为什么会这样吗?

【问题讨论】:

  • await 仅在您等待与异步操作链接的承诺时才等待异步操作。似乎Url.find() 在您传递回调时不会返回承诺,因此await 与此无关。您需要使用该功能的承诺版本才能将其与await 一起使用,或者使用util.promisify() 制作您自己的版本。

标签: node.js express mongoose async-await


【解决方案1】:

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

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

【讨论】:

    【解决方案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() 返回 Promise: http://mongoosejs.com/docs/api.html#query_Query-exec

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 1970-01-01
      • 2020-08-03
      • 2019-06-27
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多