为什么数据库查询返回结果的ID属性取值为undefined?
问题原因梳理
1. 最高发原因:数据库驱动返回结构嵌套
当前主流 Node.js 关系型数据库驱动(mysql、mysql2、pg 等)的db.query异步返回值为双元素数组:
- 第一个元素是匹配查询条件的行结果数组
- 第二个元素是查询字段的元数据数组
你直接将整个返回值序列化后赋值给thisID,等价于thisID = [ 行结果数组, 元数据数组 ],和你观测到的输出完全匹配:
- 执行
console.log(thisID[0])打印的就是行结果数组[ { ID: 4 } ],和你给出的输出一致 - 此时
thisID[0]是数组类型,对数组读取.ID属性自然返回undefined
2. 其他低概率原因
- 键名存在不可见字符或大小写差异:比如实际返回的键是全小写
id、或是键名前后带空格/零宽字符,打印时无法肉眼识别,可执行console.log(Object.keys(thisID[0]))查看真实键名列表 - 自定义序列化逻辑异常:部分驱动返回的行数据是自定义类实例,JSON 序列化后展示为普通对象,但直接取值存在特殊限制,该场景出现概率极低
修复方案
针对最常见的结构嵌套问题,接收查询结果时解构取第一位的行数组即可:
// 解构赋值取返回数组的第一个元素,即行结果数组 const [rows] = await db.query( `SELECT ID FROM MetaData WHERE MintStatus='unminted' ORDER BY rand() LIMIT 1;`, ); console.log(rows[0].ID); // 可正常输出 4
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

