yfdoor 2021-12-30 22:50 采纳率: 66.7%
浏览 85
已结题

学习 Node Express 与 Mysql 连接获取数据时遇到的问题

最近在学习 express 写后端服务的 API,其中想生成页面菜单的内容从数据库获取,可是遇到一个问题,希望在这里可以获取些帮助。
1、连接mysql 的已经封装好了,可以正常连接
2、一共是需要执行两步查询,第一步先得到 Level=0 的一级菜单项
3、第二步希望在第一步的结果中每一项都添加一个对象来保存第二步查询得到的二级菜单结果。
代码如下:

// 连接数据库
module.exports = {
  dbConnect: (sql, sqlArr, cb) => {
    const pool = mysql.createPool(db_config);
    pool.getConnection((err, connection) => {
      if (err) {
        console.log(err)
        return
      }
      connection.query(sql, sqlArr, cb)
      connection.release();
    }
    )
  }
}

获取数据
const express = require('express')
const mydb = require('../model/index')

// Get Menulist
exports.getMenuList = async (req, res, next) => {
    var sql = 'select * from tblMenuList WHERE Level=?'
    var sqlArr = ['0']

    mydb.dbConnect(sql, sqlArr, function (err, result) {
        if (err) res.send('Get MenuList fail')

        for (i = 0; i < result.length; i++) {
            var sql = 'select * from tblMenuList WHERE SubLevel=?'
            var sqlArr = [result[i].SubLevel]
            mydb.dbConnect(sql, sqlArr, function (err, subresult) {
                if (err) res.send('Get SubMenuList fail')

                console.log(subresult);
                // result[i].children=subresult
            })             
        }
        res.send(result)
    })
}

下面这是第二步查询出来的结果,是可以通过 console.log 的形式看到的,可是假如我把这行的注释打开 result[i].children=subresult ,想把 subresult 作为一个对象添加给 result.children 的时候,就会报错。提示:TypeError: Cannot set properties of undefined (setting 'children').应该是函数内部数据往外传递出了问题,可是我没有找到解决的办法,希望大佬们给些建议,谢谢了。

[
  RowDataPacket {
    ID: 1,
    Name: 'Wafer 管理',
    Level: '0',
    SubLevel: 11,
    CreateDate: null,
    UpdateDate: 2021-12-26T14:02:08.000Z
  },
  RowDataPacket {
    ID: 2,
    Name: 'Wafer 登记',
    Level: '1',
    SubLevel: 11,
    CreateDate: null,
    UpdateDate: 2021-12-26T14:02:09.000Z
  },
  RowDataPacket {
    ID: 3,
    Name: 'Wafer 查询',
    Level: '1',
    SubLevel: 11,
    CreateDate: null,
    UpdateDate: 2021-12-26T14:02:10.000Z
  },
  RowDataPacket {
    ID: 4,
    Name: 'Wafer 历史',
    Level: '1',
    SubLevel: 11,
    CreateDate: null,
    UpdateDate: 2021-12-26T14:02:12.000Z
  }
]
[
  RowDataPacket {
    ID: 5,
    Name: '用户管理',
    Level: '0',
    SubLevel: 12,
    CreateDate: null,
    UpdateDate: 2021-12-26T11:05:03.000Z
  },
  RowDataPacket {
    ID: 6,
    Name: '权限管理',
    Level: '1',
    SubLevel: 12,
    CreateDate: null,
    UpdateDate: 2021-12-26T11:05:21.000Z
  },
  RowDataPacket {
    ID: 7,
    Name: '角色管理',
    Level: '1',
    SubLevel: 12,
    CreateDate: null,
    UpdateDate: 2021-12-26T11:06:34.000Z
  }
]

测试数据库参考:

  • 写回答

1条回答 默认 最新

  • Willin 老王躺平不摆烂 区块链领域新星创作者 2021-12-31 00:29
    关注

    这是回调问题。你应该使用 Promise 方式来解决地狱回调。 这里你可以把 i 打印出来看看,应该每一次都是 result.length + 1 了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 创建了问题 12月30日

悬赏问题

  • ¥15 MPLS/VPN实验中MPLS的配置问题
  • ¥15 materialstudio氢键计算问题
  • ¥15 已知隐函数其中一个变量的,求另外一个变量
  • ¥15 echarts图表制作
  • ¥15 halcon根据玻璃面板纹路取区域
  • ¥15 HFSS设计小型化180度耦合器
  • ¥15 使用CInternetSession,CHttpFile读取网页文件时有些电脑上会卡住怎么办?
  • ¥15 水下机器人的半物理仿真研究
  • ¥15 微服务假死,一段时间后自动恢复,如何排查处理
  • ¥50 webrtc-streamer TCP rtsp