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 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题