Массив объекта становится пустым в узле js - PullRequest
0 голосов
/ 03 декабря 2018

Я новичок в узле js и пытаюсь получить данные из различных таблиц.я получил правильные данные из 1-го запроса, но внутри этого цикла мой массив объектов становится нулевым.ниже приведен мой код, пожалуйста, дайте мне знать, если требуются какие-либо изменения.

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 голосов
/ 04 декабря 2018

Один из способов асинхронности:

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})
}
)
0 голосов
/ 03 декабря 2018

Есть несколько проблем, связанных с тем, как вы это делаете, но, похоже, ваша основная проблема основана на вашем понимании обещаний.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});

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...