提问者:小点点

函数返回空数组,如何解决?Javascript,mongoose


我有一个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);
        }
    });
}

提前谢谢你。


共1个答案

匿名用户

重构函数以使用承诺,收集所有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);
    }
}