我正在尝试使用nodeJS生成嵌套数组。我也尝试过使用mongoDB和MYSQL。
我的数据库结构:
parent_id | left_id | right_id
我试图用PHP来做到这一点,并且奏效了。我在nodeJS中编写了相同的逻辑,但无法正常工作。我的猜测是由于nodeJS异步而无法正常工作。
代码:
function testRecX(parent_id, callback) {
let xyz = {};
connection.query('SELECT * FROM test WHERE parent_id = ' + parent_id, function (err, rows, fields) {
if (err) throw err
xyz.parent = parent_id;
if(rows[0].left_id) {
console.log(" -- LEFT -- " + rows[0].left_id);
xyz.left = testRecX(rows[0].left_id, null);
}
if(rows[0].right_id) {
console.log(" -- RIGHT -- " + rows[0].right_id);
xyz.right = testRecX(rows[0].right_id, null);
}
if(callback == null) {
console.log(" -- RETURN -- " + xyz);
return xyz;
}
else {
console.log(" -- CALLBACK -- " + xyz);
return callback(xyz);
}
});
}
我得到的输出:
需要的输出:
{
parent: 1,
left: {
parent: 2,
left: {
parent: 4,
left: {
parent: 8,
left: null,
right: null
},
right: null
},
right: {
parent: 5,
left: null,
right: null
}
},
right: {
parent: 3,
left: {
parent: 6,
left: null,
right: {
parent: 9,
left: null,
right: null
}
},
right: {
parent: 7,
left: null,
right: null
}
}
}
答案 0 :(得分:0)
也许可行(需要在node.js 7.6及更高版本中提供ES8支持):
async function testRecX(parent_id, callback) {
let xyz = {};
await connection.query('SELECT * FROM test WHERE parent_id = ' + parent_id,
async function (err, rows, fields) {
if (err) throw err
xyz.parent = parent_id;
xyz.left = await (rows[0].left_id?testRecX(rows[0].left_id, null):null)
xyz.right = await (rows[0].right_id?testRecX(rows[0].right_id, null):null)
return callback?(console.log(" -- CALLBACK -- " + xyz), callback(xyz)):(console.log(" -- RETURN -- " + xyz),xyz);
});
}
const results= testRecX(callback).then(data=>console.log(data));
答案 1 :(得分:0)
发生这种情况是因为Node.js是非渲染阻止的。它不会等待SELECT
查询完成。
因此,对于I / O操作,请使用promise。您的代码应为:
function testRecX(parent_id, callback) {
let xyz = {};
connection.query('SELECT * FROM test WHERE parent_id = ' + parent_id,
function (err, rows, fields).then(rows=>{
//your other code here
}).catch(err=>console.log(err))
答案 2 :(得分:0)
我尝试了这段代码,它仅覆盖第一代树。 而且该功能中只有控制台显示数据。
const结果= testRecX(user [0] .user_id,function(data){console.log(data)});
结果显示为空数组。
function testRecX(parent_id, callback) {
let xyz = {};
Referral.find({parent_id:parent_id})
.then( (err, rows, fields) => {
if (err) throw err
console.log(rows);
xyz.parent = parent_id;
xyz.left = (rows[0].left ? testRecX(rows[0].left, null):null);
xyz.right = (rows[0].right ? testRecX(rows[0].right, null):null);
return callback ? (console.log(" -- CALLBACK -- " + xyz), callback(xyz)):(console.log(" -- RETURN -- " + xyz),xyz);
}).catch(function (err) {
console.log(err);
});
}