Node js数组推送功能不起作用

时间:2019-04-14 15:42:34

标签: javascript node.js mongoose

我正在尝试从两个不同的集合category_typescategories中获取数据。每个类别都有一个父类别类型。因此,我想在类别的每个索引中查找所有类别时推送category_type详细信息。

这是我的代码

exports.findAllWithParentChild = (req, res) => {
    let resData = [];
    Models.Category.find()
    .then(data => {
        data.forEach(element => {
             Models.CategoryType.findById(mongoose.Types.ObjectId(element.categorytype_id))
             .then(catType => {
                resData.push(element, {'category_type' : catType})
            })
        });
        console.log(resData)
        res.send({
            response: true,
            message: 'Categories fetched successfully.',
            data : resData
        });
    }).catch(err => {
        res.status(500).send({
            response: false,
            message: "Some error occurred while retrieving."
        });
    });
};

如果我在循环中使用控制台resData,则它可以正确打印数据,在循环外它为空并发送空响应。

我希望格式看起来像这样

[{   
    _id: 5cb2f300ce34a53c9070ca9c,
    title: 'edeededede',
    description: 'dededededed',
    slug: 'ededede',
    categorytype_id: 5cb2f247db13d03360a3a3c5,
    user_id: 'dedede',
    created_at: 2019-04-14T08:44:48.516Z,
    updated_at: 2019-04-14T08:44:48.516Z,
    __v: 0 ,
    category_type:
     { 
       _id: 5cb2f247db13d03360a3a3c5,
       title: 'trgtrgtrg',
       description: 'trgtrgtrg',
       slug: 'trgtrgtr',
       user_id: 'gtrgtrgtr',
       created_at: 2019-04-14T08:41:43.935Z,
       updated_at: 2019-04-14T08:41:43.935Z,
       __v: 0
     }
}]

如果有更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

这里的问题是,您的console.log在异步函数之前(在then语句内)执行。您应该考虑使用async/await语句,如下所示。

exports.findAllWithParentChild = (req, res) => {
    let resData = [];
    Models.Category.find()
    .then(data => {
        data.forEach(async element => {
             let catType= await Models.CategoryType.findById(mongoose.Types.ObjectId(element.categorytype_id));
             resData.push(element, {'category_type' : catType});                 
        });
        console.log(resData)
        res.send({
            response: true,
            message: 'Categories fetched successfully.',
            data : resData
        });
    }).catch(err => {
        res.status(500).send({
            response: false,
            message: "Some error occurred while retrieving."
        });
    });
};