node.js - 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 完成并返回。有人知道为什么会这样吗?
解决方案
我不知道那个库或方法的细节,但我可以告诉你为什么它不起作用。
只有当语句的右侧返回“Promise”对象时,“await”才会暂停。在您的代码示例中,该函数似乎需要一个回调。回调虽然是异步的,但不是承诺。也许您可以检查该库的 API 文档以查看它是否可以返回 Promise 而不是接受回调?
推荐阅读
- sql-server - SSRS 数据驱动订阅 - 验证查询按钮已禁用
- javascript - 如何在 Django 上使用 openpyxl 从服务器下载 Excel 表?
- javascript - 未捕获的 TypeError:seatIndex 不是函数
- javascript - Azure SpeechSynthesizer 错误 HTTP:不支持。预期的 HTTPS:NPM `microsoft-cognitiveservices-speech-sdk`
- kotlin - 在 kotlin 中抛出参数化异常的方法是什么?
- swift - UIDatePicker 更改字体颜色 ios15
- python - Pyspark Dataframe 中两个字符串之间的相似性
- power-automate - Microsoft Forms 数组到电子邮件列表
- sql - Oracle SQL Loader 控制文件:使用 WHEN 上传不同表中的标头
- laravel - 如何使用 laravel 查询生成器进行 JOIN ON CASE?