Node.js中如何处理MySQL SELECT查询返回的RowDataPacket数据
解决方案
1. 最快修复当前字段取值问题:给转换后的字段加别名
你遇到的CAST后字段名异常问题根本不需要改取值逻辑,只需要在SQL里给转换后的字段加和原来字段名一致的别名即可,修改后的SQL如下:
SELECT CAST(${kenneledMemberRoleKey} AS Char) AS ${kenneledMemberRoleKey} FROM ${kenneledMemberRolesTableName} WHERE ${kenneledMemberKey} = ?
加了AS ${kenneledMemberRoleKey}之后,返回的RowDataPacket里的键名还是原来的kenneled_member_role_id,你原来的map取值逻辑完全不需要改动。
注意:上面SQL里把直接拼接的kenneledMemberId换成了预编译占位符?,你后续调用查询方法的时候把参数作为第二个参数传入,可以避免SQL注入风险,比直接拼接字符串安全很多。
2. RowDataPacket的通用简洁处理方案
你之前用的JSON.parse(JSON.stringify(rows))完全是多余操作,RowDataPacket本质就是普通的JavaScript对象,只是原型被驱动封装了一层,完全可以直接操作,推荐两种更高效的处理方式:
- 如果你只需要单字段的结果集合,可以在MySQL连接配置里开启
rowsAsArray: true,查询返回的直接是值数组,不需要做任何遍历映射,单字段查询场景下可以省掉map操作。 - 如果你需要多字段结果,直接遍历返回的rows即可,不需要做序列化反序列化处理,取值可以用点语法,也可以用方括号语法
row[字段名]适配动态字段名的场景。
优化后的完整代码示例
const kenneledMemberRolesTableName = 'kenneled_member_roles' const kenneledMemberKey = 'kenneled_member' const kenneledMemberRoleKey = 'kenneled_member_role_id' const kenneledStaffMemberKey = 'kenneled_staff_member' const kenneledDateKey = 'kenneled_date' const kenneledReturnableRoleKey = 'kenneled_role_can_be_returned' async function findKenneledMemberRoles(kenneledMemberId) { // 加别名+使用预编译占位符避免注入 const sql = `SELECT CAST(${kenneledMemberRoleKey} AS Char) AS ${kenneledMemberRoleKey} FROM ${kenneledMemberRolesTableName} WHERE ${kenneledMemberKey} = ?` // 传入参数执行预编译查询 const rows = await databaseAccessor.runQuery(sql, [kenneledMemberId]) // 直接遍历取值,不需要序列化处理 return rows.map(row => row[kenneledMemberRoleKey]) }
内容的提问来源于stack exchange,提问作者Chressin
相关产品推荐
相关产品推荐

