查询不在循环函数nodejs MySQL中执行



我是NodeJs的初学者,我试图在一段时间内运行SQL查询,但它没有执行查询。我有一个函数,其中有一个来自数据库的数据数组,如果我得到结果,我会将它们保存在两个数组中,然后我为while循环声明了一个辅助变量。在while内部,我必须选择其中一个数组中具有reference_id的所有成员。如果我得到数据,我必须再次将数据保存在2个数组中,并重复操作,直到数据库中没有数据。问题是查询和查询内部的所有操作都不工作,我不知道为什么。

循环中的所有内容都被执行,只有查询没有被执行。

const membersPiramid2 = (request, response) => {
let member_id = request.params.member_id;
let members_ids = [];
let members = [];
let aux = true;
db.query(`SELECT member_id FROM structures WHERE reference_id = '${member_id}'`, (error, results) => {
if (error) throw error;
if (results.length > 0) {
members_ids = results.map(r => r.member_id);
members.push(results);

while (aux) {
db.query(`SELECT member_id FROM structures WHERE reference_id IN ('${members_ids}')`, (err, newMembers) => {
if (err) throw err;
if (newMembers.length > 0) {
members.push(newMembers);
members_ids.length = 0
members_ids = newMembers.map(m => m.member_id)
} else {
aux = false
}
})
}
}
response.send(members);

我尝试使用承诺和异步函数,但如果我使用任何循环,它仍然不工作

function submembersPiramid(members_ids) {
return new Promise((resolve, reject) => {
db.query(`SELECT member_id FROM structures WHERE reference_id IN ('${members_ids}')`, (err, newMembers) => {
console.log('hola2')
if (newMembers.length > 0) {
resolve(newMembers)
} else {
reject('No data found')
}
})
})
}


const membersPiramid = (request, response) => {
let member_id = request.params.member_id;
let members_ids = [];
let members = [];
let aux = true;
db.query(`SELECT member_id FROM structures WHERE reference_id = '${member_id}'`, (error, results) => {
if (error) throw error;
if (results.length > 0) {
members_ids = results.map(r => r.member_id);
members.push(results);

async function doFunction() {
await submembersPiramid(members_ids).then(response => {
if (response != 'No data found') {
members.push(response);
members_ids.length = 0;
members_ids = response.map(r => r.member_id)
} else {
aux = false;
}
}).then()
}
while(aux){
doFunction()
}

}
response.send(members);
})
}

知道为什么查询不能在任何循环中工作吗?

查询结果如下输入图片描述

这样做可能更简单,而且效率要高很多倍:

SELECT p.member_id as parent_member_id, c.member_id as child_member_id
FROM structures p
INNER JOIN structures c on c.reference_id = p.member_id
WHERE p.reference_id = '${member_id}'

当我们在这里的时候,这看起来很容易受到sql注入的攻击。Sql注入是大事因此,请花一些时间确保您了解什么是SQL注入以及您的平台使用准备语句/参数化查询的机制。

无需两次查询,只需一次查询即可完成所有操作

db.query(`SELECT  member_id FROM structures WHERE reference_id IN (SELECT member_id FROM structures WHERE reference_id = '${member_id}') UNION SELECT member_id FROM structures WHERE reference_id = '${member_id}'`
, (err, newMembers) => {
if (err) throw err;
if (newMembers.length > 0) {
members.push(newMembers);
members_ids.length = 0
members_ids = newMembers.map(m => m.member_id)
} else {
aux = false
}
})

如果你真的想使用嵌套查询,这在很少的情况下是必要的,你应该看到这里的解决方案,异步通信是强制性的。

讲到这里,你可以看一下sql注入防止sql注入到Node.js

获取所有member_ids的查询必须是

SELECT 
member_id
FROM
structures
WHERE
reference_id IN (SELECT 
member_id
FROM
structures
WHERE
reference_id = '${member_id}') 
UNION SELECT 
member_id
FROM
structures
WHERE
reference_id = '${member_id}'

最新更新