You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js读取MySQL中JSON数组时访问子元素报错的解决咨询

问题解决步骤

核心问题分析

  1. 异步代码混用错误:你同时使用await和回调函数调用connection.query,但query使用回调时不会返回Promise,await完全无效,导致后续操作的result可能不是查询完成后的正确数据。
  2. JSON字段未正确解析:MySQL的JSON类型字段在默认mysql驱动中会以字符串形式返回,直接访问对象属性会报错;即使尝试JSON.stringify再JSON.parse,如果原数据已被驱动自动解析为对象,这步操作反而会引发问题。
  3. 索引错误:你要获取的第一个数组元素的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:45:37