Node.js使用mysql2/promise查询MySQL返回ColumnDefinition结构异常
问题原因
- mysql2/promise的
con.query()执行SELECT查询后,返回值是固定的二元组结构:第一个元素是匹配查询条件的行数据数组,第二个元素是对应表的字段元描述信息,也就是你打印出来的ColumnDefinition结构 - 你封装的Query方法直接返回了完整的二元组,没有单独取出业务需要的行数据
- 额外隐藏问题:当前代码只有查询报错时才会释放连接,查询正常的情况下连接不会被释放,会快速耗尽连接池的可用连接
解决方案
1. 修正底层Query方法(推荐)
调整返回值逻辑和连接释放逻辑,适配常规业务使用习惯:
public async Query(sql: any, parameters?: any, connection?: PoolConnection): Promise<any> { const con = connection || (await this.GetConnection()); try { // 解构取出第一个元素的行数据直接返回 const [rows] = await con.query(sql, parameters); return rows; } catch (error) { throw error; } finally { // 无论查询成功失败都释放连接,外部传入的连接不做释放处理 if (!connection) con.release(); } }
修改后原有业务调用代码无需改动,直接就能拿到预期的查询数据。
2. 调用侧直接适配(不想改底层代码可选)
如果不调整封装的Query方法,也可以在调用时自行解构取行数据:
const [result] = await this.mysqlManager.Query(sql,number); console.log(result);
内容的提问来源于stack exchange,提问作者Rohit Mittal
相关产品推荐
相关产品推荐

