函数返回空数组,如何解决?Javascript,猫鼬
我有一个javascript,mongoose函数,它应该返回一个数组。所以基本上我有一个用户模式和一个购物清单模式。用户模式有一个参数,它是authorizedLists,一个购物列表ID数组。我想要的是,通过将用户id作为参数传递,我可以显示用户在其中授权的列表。这个函数现在返回一个空数组,我所期望的是一个包含购物列表对象的数组。 我知道由于Javascript异步读取代码的方式,它不起作用,但我在这里真的被绊住了。 另外,我对nodejs和mongoose还比较陌生,所以我可能犯了其他错误,但还没有意识到 代码:函数返回空数组,如何解决?Javascript,猫鼬,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个javascript,mongoose函数,它应该返回一个数组。所以基本上我有一个用户模式和一个购物清单模式。用户模式有一个参数,它是authorizedLists,一个购物列表ID数组。我想要的是,通过将用户id作为参数传递,我可以显示用户在其中授权的列表。这个函数现在返回一个空数组,我所期望的是一个包含购物列表对象的数组。 我知道由于Javascript异步读取代码的方式,它不起作用,但我在这里真的被绊住了。 另外,我对nodejs和mongoose还比较陌生,所以我可能犯了其他错误
提前感谢。重构函数以使用承诺,收集所有
授权列表
,并使用运算符一次性传递,而不是重复执行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);
}
}
由于ShoppingList.findById是一个i/o调用,控件默认情况下不会等待完成此调用,直接跳转到
list.push(结果)代码>与列表空值。
您需要使用promise使它等待,直到它从i/o调用中获得结果,然后您应该返回响应。这样,将为每个数组项调用更新列表
像这样的-
async function getUserAuthLists(req, res) {
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);
await ShoppingListFromDB(array)
.then((list) => {
console.log("list--", list);
return res.status(202).send(list);
})
.catch((error) => {
console.log(error);
return res.status(404).send(err);
})
});
}
我已经创建了一个模拟您需求的示例
服务器
客户
谢谢!!效果非常好。
async function getUserAuthLists(req, res) {
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);
await ShoppingListFromDB(array)
.then((list) => {
console.log("list--", list);
return res.status(202).send(list);
})
.catch((error) => {
console.log(error);
return res.status(404).send(err);
})
});
}
function ShoppingListFromDB(array) {
return new Promise((resolve, reject) => {
let i = 0
var list = [];
for (const element of array) {
console.log("element ", element);
ShoppingList.findById(element, (error, result) => {
if (err) {
console.log(err)
return reject(error);
}
i++
list.push(result)
if (i == array.length) {
return resolve(list)
}
})
}
})
}