Nodejs node-mysql query回调有点坑

Nodejs node-mysql query回调有点坑

大家轻点喷,对于我这个新手来说确实挺坑的。 id pid name 1 0 a 2 0 b 3 1 c 4 1 d 5 3 e

现有表数据如上,pid关联id形成父子关系,想通过查询组成树状结构,可是通过回调的方式弄的我焦头烂额。求思路。谢谢。

5 回复

标题:Nodejs node-mysql query回调有点坑

内容:

大家轻点喷,对于我这个新手来说确实挺坑的。假设有如下表数据:

id  pid  name
1    0   a
2    0   b
3    1   c
4    1   d
5    3   e

现有表数据如上,pid 关联 id 形成父子关系,想通过查询组成树状结构,可是通过回调的方式弄的我焦头烂额。求思路。谢谢。


解决方案

在 Node.js 中使用 node-mysql 库查询数据库并处理嵌套数据时,可能会遇到回调地狱的问题。为了解决这个问题,我们可以采取递归的方式来构建树状结构。

示例代码

首先,我们需要安装 mysql 包:

npm install mysql

接下来,我们编写一个函数来获取所有数据,并将其转换为树状结构:

const mysql = require('mysql');

// 创建 MySQL 连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database'
});

connection.connect((err) => {
  if (err) throw err;
  console.log('Connected to the database.');
});

function buildTree(items, parentId = 0) {
  return items
    .filter(item => item.pid === parentId)
    .map(item => ({ ...item, children: buildTree(items, item.id) }));
}

function getTree(callback) {
  connection.query('SELECT * FROM your_table', (error, results) => {
    if (error) throw error;

    const tree = buildTree(results);
    callback(null, tree);
  });
}

// 使用函数
getTree((err, tree) => {
  if (err) throw err;
  console.log(JSON.stringify(tree, null, 2));
  connection.end();
});

代码解释

  1. 连接数据库:我们使用 mysql.createConnection 方法创建一个到数据库的连接。
  2. 构建树状结构buildTree 函数是一个递归函数,它接受一个数组 items 和父节点 ID parentId。它会过滤出父节点 ID 匹配的数据,并为每个匹配项递归调用自身以构建子节点。
  3. 查询数据getTree 函数执行 SQL 查询并调用回调函数传递构建好的树状结构。
  4. 处理结果:我们在 getTree 的回调中打印构建好的树状结构,并关闭数据库连接。

这样,我们就可以避免回调地狱的问题,并且可以轻松地将查询结果转换为树状结构。希望这个解决方案对你有所帮助!


select * from table.

全部取出,在内存里构建树型结构。

谢谢你,我只能这样了。

看量了,量不大1楼方式挺好的,量大还是要自己拼接sql

在使用 node-mysql 进行数据库操作时,处理异步回调确实可能会遇到一些挑战。特别是在你需要递归查询或处理多级关联数据时,回调地狱(callback hell)问题尤为明显。

对于你的需求,即从一个具有父子关系的表中构建树状结构,可以通过递归查询来实现。下面是一个简单的示例代码,展示了如何通过递归查询将数据构建成树状结构。

const mysql = require('mysql');

// 创建数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'testdb'
});

connection.connect();

function buildTree(data, parentId = 0) {
  return data
    .filter(item => item.pid === parentId)
    .map(item => ({
      ...item,
      children: buildTree(data, item.id)
    }));
}

function getTree(callback) {
  connection.query('SELECT id, pid, name FROM your_table', (error, results) => {
    if (error) throw error;
    const tree = buildTree(results);
    callback(null, tree);
  });
}

getTree((err, tree) => {
  if (err) throw err;
  console.log(JSON.stringify(tree, null, 2));
  connection.end();
});

解释

  1. 创建数据库连接:使用 mysql.createConnection 创建一个数据库连接对象。
  2. 定义 buildTree 函数:这个函数负责根据父 ID 构建子节点的树状结构。
  3. 定义 getTree 函数:这个函数执行 SQL 查询并将结果传递给 buildTree 函数以构建树状结构。
  4. 调用 getTree 函数:通过回调将最终的树状结构输出到控制台,并关闭数据库连接。

这样就可以通过递归查询将数据构建成树状结构。希望这能帮助你解决遇到的问题!

回到顶部