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

函数返回空数组,如何解决?Javascript,猫鼬,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个javascript,mongoose函数,它应该返回一个数组。所以基本上我有一个用户模式和一个购物清单模式。用户模式有一个参数,它是authorizedLists,一个购物列表ID数组。我想要的是,通过将用户id作为参数传递,我可以显示用户在其中授权的列表。这个函数现在返回一个空数组,我所期望的是一个包含购物列表对象的数组。 我知道由于Javascript异步读取代码的方式,它不起作用,但我在这里真的被绊住了。 另外,我对nodejs和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)
                }
            })
        }

    })
}