我正在使用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完成并返回。任何人都有任何想法为什么会这样?
答案 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);
}
}
.find()
会返回Query
个对象:http://mongoosejs.com/docs/api.html#find_find .exec()
返回Promise
:http://mongoosejs.com/docs/api.html#query_Query-exec