【发布时间】: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