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来获取内部迭代器!
答案 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)
尝试使用let
或const
代替var
。对于所有迭代器,使用与i
不同的变量名。这可能会弄乱您的第一个i
,从而导致rows[i]
为undefined
。
您可能还想查找支持ES6 Promises的MySQL节点模块,如下所示:https://www.npmjs.com/package/mysql2