我有一个javascript,mongoose函数,它应该返回一个数组。所以基本上我有一个用户模式和一个购物列表模式。用户模式有一个参数authorizedLists,一个购物列表ID数组。我想要的是,通过将用户id作为参数传递,我可以显示用户被授权的列表。这个函数现在返回一个空数组,而我所期望的是一个带有购物列表对象的数组。我知道由于Javascript异步读取代码的方式,它不能正常工作,但我真的很迷恋这里。另外,我对nodejs和mongoose还比较陌生,所以我可能犯了其他错误,但我还没有意识到。
代码:
function getUserAuthLists(req,res){
const { userId } = req.params;
var list = [];
let i = 0;
User.findById( userId,async function(err, user){
if(err) return res.status(404).send(err);
console.log(user);
const array = user.authorizedLists;
console.log(array);
array.forEach( function(element){
console.log(element);
ShoppingList.findById(element , (error, result)=>{
if(error) {
console.log(error);
return res.status(404).send(error);
}
list.push(result);
console.log(list);
});
i++;
});
if(i === array.length) {
console.log(list);
return res.status(202).send(list);
}
});
}
提前谢谢你。
重构函数以使用承诺,收集所有AuthorizedLists
并使用$in
运算符一次性传递它,而不是重复执行FindById
async function getUserAuthLists(req, res){
try {
const { userId } = req.params;
let i = 0;
const user = await User.findById(userId).exec();
const list = await ShoppingList.find({
_id: {
$in: user.authorizedLists
}
}).exec();
return res.status(202).send(list);
} catch (err) {
return res.status(404).send(err);
}
}