修改NodeJS中嵌套查询的结果

时间:2018-02-20 17:07:10

标签: javascript node.js

Naive to NodeJS并试图找出一种方法将第二个表的结果添加到节点js中第一个表的结果集。

如何在第二个查询中访问第一个查询的结果?

以下是我的带注释的代码段

function getTasks(callback) {
//first query gives result set
connection.query('SELECT * FROM ' + properties.get('database.Table') +' order by timestamp desc', function(err, rows){
    if(!err){
        //for each result from result set, match on Id and get values from table_2
        for (var i = rows.length - 1; i >= 0; i--) {
            connection.query('SELECT * FROM table_2 where taskId = "' + rows[i].taskId + '"', function(err, sets){
                if(!err){
                    //if we have any results from table_2 then create an object
                    if(sets.length > 0){
                        var setStatus = [];
                        for (var i = sets.length - 1; i >= 0; i--) {
                            setStatus[i] = {Status : sets[i].type+'-'+sets[i].status};
                        }
                        //add the setStaus object to results from first table (to rows)
                        //ISSUE: accessing rows[i] here is alwyas undefined??
                    }
                }
            });
        }
        //need to send the rows with updates from nested block
        callback(rows);
    }
});

更新:async / await解决方案工作,并通过将i更改为j来获取内部迭代器!

3 个答案:

答案 0 :(得分:2)

您可以使用async / await

进行处理
const execute = (query) => {
    return new Promise((resove, reject) => {
        connection.query(query,
            function (err, rows) {
                if (err) reject(err);
                resove(rows);
            });
    });
}

const getTasks = async () => {
    const query = 'SELECT * FROM ' + properties.get('database.Table') + ' order by timestamp desc';
    const rows = await execute(query);
    for (var i = rows.length - 1; i >= 0; i--) {
        const innerQuery = 'SELECT * FROM table_2 where taskId = "' + rows[i].taskId + '"';
        const sets = await execute(innerQuery);
        //Do some stuff
        if (sets.length > 0) {
            var setStatus = [];
            for (var i = sets.length - 1; i >= 0; i--) {
                setStatus[i] = {
                    Status: sets[i].type + '-' + sets[i].status
                };
            }
        }
    }
    return rows;
};

Yau可以在内部等待或在下面给出

getTasks().then((rows) => {
    console.log(rows);
}).catch((err) => {
    console.log(err);
})

答案 1 :(得分:1)

第二个for循环中i的声明会覆盖第一个循环中i的值。

您可以通过将声明为第二个循环的一部分的变量更改为i以外的其他内容来解决此问题。

答案 2 :(得分:1)

尝试使用letconst代替var。对于所有迭代器,使用与i不同的变量名。这可能会弄乱您的第一个i,从而导致rows[i]undefined

您可能还想查找支持ES6 Promises的MySQL节点模块,如下所示:https://www.npmjs.com/package/mysql2