使用递归,使用节点JS和数据库(mysql / mongoDB)生成嵌套数组

时间:2018-12-01 19:37:55

标签: node.js

我正在尝试使用nodeJS生成嵌套数组。我也尝试过使用mongoDB和MYSQL。

我的数据库结构:

parent_id | left_id | right_id

enter image description here

我试图用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);
        }
    });
}

我得到的输出:

enter image description here

需要的输出:

{
  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
    }
  }
}

3 个答案:

答案 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);
    });

}

tree image is attached