Node.js读取MySQL中JSON数组时访问子元素报错的解决咨询
问题解决步骤
核心问题分析
- 异步代码混用错误:你同时使用
await和回调函数调用connection.query,但query使用回调时不会返回Promise,await完全无效,导致后续操作的result可能不是查询完成后的正确数据。 - JSON字段未正确解析:MySQL的JSON类型字段在默认
mysql驱动中会以字符串形式返回,直接访问对象属性会报错;即使尝试JSON.stringify再JSON.parse,如果原数据已被驱动自动解析为对象,这步操作反而会引发问题。 - 索引错误:你要获取的第一个数组元素的
code,应该用索引0而非1,characters[0].code才是值为"45"的目标元素。
修正后的代码示例
方式1:使用mysql2的Promise版本(推荐)
mysql2支持自动解析JSON字段,同时原生支持Promise,避免回调混用问题:
const mysql = require('mysql2/promise'); async function fetchCharacterData() { // 配置数据库连接信息 const connection = await mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名', // 开启自动解析JSON字段 parseJson: true }); try { // 执行查询,获取结果集 const [rows] = await connection.query(charSessSearch_query); console.log("------> done Results 1"); console.log(rows.length); // 直接访问解析后的JSON对象 const targetCode = rows[0].init_characters.characters[0].code; console.log(targetCode); // 输出 "45" } catch (err) { console.error('查询出错:', err); } finally { // 关闭数据库连接 await connection.end(); } } // 执行查询函数 fetchCharacterData();
方式2:使用原生mysql驱动+手动解析JSON
如果坚持使用旧版mysql驱动,需要手动处理Promise和JSON解析:
const mysql = require('mysql'); const util = require('util'); // 创建数据库连接 const connection = mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名' }); // 将query方法转为Promise形式 const query = util.promisify(connection.query).bind(connection); async function fetchCharacterData() { try { const rows = await query(charSessSearch_query); console.log("------> done Results 1"); console.log(rows.length); // 手动解析JSON字符串为对象 const initCharacters = JSON.parse(rows[0].init_characters); const targetCode = initCharacters.characters[0].code; console.log(targetCode); // 输出 "45" } catch (err) { console.error('查询出错:', err); } finally { connection.end(); } } fetchCharacterData();
关键注意点
- 禁止混用
await和回调函数处理异步操作,这会导致流程混乱,无法正确获取数据。 - 确认驱动对JSON字段的处理逻辑:mysql2可开启自动解析,旧版mysql需手动执行
JSON.parse。 - 数组索引从0开始,第一个元素用
[0],不要误写为[1]。
内容的提问来源于stack exchange,提问作者Cutting_edge
相关产品推荐
相关产品推荐

