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

学习 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条回答 默认 最新

  • 关注

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

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分