Javascript 修改NodeJS中嵌套查询的结果

Javascript 修改NodeJS中嵌套查询的结果,javascript,node.js,Javascript,Node.js,对NodeJS很幼稚,并试图找出一种方法,将第二个表中的结果添加到节点js中第一个表的结果集中 如何在第二个查询中访问第一个查询的结果 下面是我的代码片段和注释 function getTasks(callback) { //first query gives result set connection.query('SELECT * FROM ' + properties.get('database.Table') +' order by timestamp desc', function(e

对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);
    }
});

更新:通过将内部迭代器的i改为j,异步/等待解决方案成功了

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


您可以通过将作为第二个循环的一部分声明的变量更改为除
i
之外的其他变量来解决此问题。第二个for循环中
i
的声明将覆盖第一个循环中
i
的值


您可以通过将声明为第二个循环的一部分的变量更改为除
i

之外的其他变量来解决此问题。您可以使用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);
})

您可以使用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);
})

尝试使用
let
const
而不是
var
。对所有迭代器使用不同于
i
的变量名。这可能会弄乱您的第一个
i
,从而导致
行[i]
成为
未定义的


您可能还想寻找一个支持ES6承诺的MySQL节点模块,比如:尝试使用
let
const
而不是
var
。对所有迭代器使用不同于
i
的变量名。这可能会弄乱您的第一个
i
,从而导致
行[i]
成为
未定义的


您可能还想寻找一个支持ES6承诺的MySQL节点模块,如下所示:

use async/await for async call.use async/await for async call。