对象数组在节点js

时间:2018-12-03 13:31:17

标签: node.js express

我是Node js的新手,并尝试从各种表中获取数据。我从第一查询中获得了正确的数据,但是在该循环中,我的对象数组变为空。下面是我的代码,如果需要任何更改,请告诉我。

connection.query(`SELECT * FROM featured_tags WHERE status = 1 order by id desc`, function (error, results, fields) {
        if (error) {
            res.json({
                status:401,
                message:'there are some error with query'
            })
        }else{
            var featured_tagdataset = [];
            var itemdata = [];
            if(results.length >0){
                for (var i = 0; i < results.length; i++) {
                    var row = results[i];
                    var featurtag = {};
                    featurtag.id = row.id;
                    featurtag.featured_tag = row.featured_tag;
                    connection.query("SELECT * FROM `items` WHERE status = 1 and FIND_IN_SET('"+ row.id +"' ,featured_tags) > 0", function (error1, itemresult, fields) {
                        if(itemresult.length > 0){
                            for(var l=0; l < itemresult.length; l++){
                                var itemrow = itemresult[l];
                                var item = {};
                                item.id = itemrow.id;
                                item.category_id = row.id;
                                item.name = itemrow.item_name;
                                itemdata.push(item);
                            }                               
                        }
                        console.log(itemdata);
                    });
                    featurtag.tag_items = itemdata;
                    featured_tagdataset.push(featurtag);
                }
            }
            res.json({
                status:200,
                message:'item list',
                data: featured_tagdataset
            });
        }   
    });

我能够在console.log(itemdata)中获取数据;但是在featurtag.tag_items = itemdata中,它显示了空白数组。像下面一样

"data": [
    {
        "id": 4,
        "featured_tag": "User's Choice",
        "tag_items": []
    },
    {
        "id": 1,
        "featured_tag": "Recomanded",
        "tag_items": []
    }
]

2 个答案:

答案 0 :(得分:0)

您执行此操作的方式存在多个问题,但看来您的主要问题是基于您对诺言的理解。 connection.query(...)返回一个诺言,其中包含您要在其中利用的数据。因为这是一个承诺,而不是立即返回数据,所以您将无法以预期的方式访问它。

如果您确定这是您要采用的方法,则需要在函数中使用杠杆和async-await,这样,在转到下一个之前,您将拥有所需的数据。循环的重复。

另一种方法可能是利用sequelize,并在查询中使用include自动将数据包括在查询中。我敢肯定,您也可以通过一个更复杂的sql查询,以将所有信息都包含在一个查询中,但仅提供一些可能的建议以供将来使用。

================================================ =========================== 编辑:

这是一个未经测试的示例,在该示例中,我尝试修改您的代码以适合异步模式。不过,我认为您绝对应该修改此代码,以使其作为单个查询执行,而不是遍历结果。

async function test() {
    let results;
    try {
        results = await connection.query('SELECT * FROM featured_tags WHERE status = 1 order by id desc');
    } catch (e) {
        return res.status(401).json({message:'there are some error with query'});
    }

    var featured_tagdataset = [];
    var itemdata = [];
    if (results.length > 0) {
        for (var i = 0; i < results.length; i++) {
            var row = results[i];
            var featurtag = {};
            featurtag.id = row.id;
            featurtag.featured_tag = row.featured_tag;

            // Get item results
            let itemresult;
            try {
                itemresult = await connection.query("SELECT * FROM `items` WHERE status = 1 and FIND_IN_SET('"+ row.id +"' ,featured_tags) > 0");

            } catch (e) {
                // Handle error
            }
            if (itemresult.length > 0){
                for(var l=0; l < itemresult.length; l++){
                    var itemrow = itemresult[l];
                    var item = {};
                    item.id = itemrow.id;
                    item.category_id = row.id;
                    item.name = itemrow.item_name;
                    itemdata.push(item);
                }                               
            }
            console.log(itemdata);
            featurtag.tag_items = itemdata;
            featured_tagdataset.push(featurtag);
        }
    }
    return res.status(200).json({message:'item list', data: featured_tagdataset});

}

答案 1 :(得分:0)

一种异步方式是:

connection.query(`SELECT * FROM featured_tags WHERE status = 1 order by id desc`)
.then(results=>{
   //Query was successful and has given results, all your code in this block
}).catch(err=>{
   res.status(401).json({err})
}
)