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

使用node-mysql查询MySQL JSON类型数据返回带转义反斜杠问题

解决node-mysql获取MySQL JSON数据时的转义问题

嘿,这个问题我之前踩过坑!你看到的反斜杠转义,是因为旧版的node-mysql模块没有自动识别MySQL返回的JSON类型字段,而是把它们当成普通字符串处理,所以原本的JSON结构被转义成了带反斜杠的字符串形式。下面给你几个实用的解决办法:

方法1:手动解析结果中的JSON字段

如果不想改动依赖包,最简单的方式就是在拿到查询结果后,手动把对应的JSON字符串解析成JavaScript对象:

// 执行查询
connection.query(`SELECT countries.id, countries.country_name, 
  Json_object("start", start_port, "end", end_port) ten_minutes, 
  Json_object("start", start_port + 10000, "end", end_port + 10000) one_minutes, 
  Json_object("start", start_port + 20000, "end", end_port + 20000) thirty_minutes 
FROM countries JOIN countries_port_ranges ON country_id = countries.id;`, 
(err, results) => {
  if (err) throw err;
  
  // 遍历结果,解析JSON字段
  const processedResults = results.map(row => ({
    ...row,
    ten_minutes: JSON.parse(row.ten_minutes),
    one_minutes: JSON.parse(row.one_minutes),
    thirty_minutes: JSON.parse(row.thirty_minutes)
  }));
  
  // 现在processedResults里的JSON字段就是正常的对象了
  console.log(processedResults);
});

方法2:配置连接的typeCast自动解析JSON

可以在创建数据库连接时,通过typeCast函数自动识别并解析JSON类型的字段,这样每次查询都不用手动处理了:

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: '你的数据库地址',
  user: '用户名',
  password: '密码',
  database: '数据库名',
  // 自定义类型转换
  typeCast: function(field, next) {
    // 如果字段类型是JSON,就解析成对象
    if (field.type === 'JSON') {
      return JSON.parse(field.string());
    }
    // 其他类型按默认处理
    return next();
  }
});

方法3:升级到mysql2(更推荐)

node-mysql其实已经停止维护了,更推荐你换成mysql2模块——它原生支持MySQL的JSON类型解析,不需要额外配置就能直接拿到JSON对象:

首先安装mysql2:

npm install mysql2

然后用mysql2的连接方式(支持Promise,写异步代码更舒服):

const mysql = require('mysql2/promise');

async function fetchCountries() {
  try {
    const connection = await mysql.createConnection({
      host: '你的数据库地址',
      user: '用户名',
      password: '密码',
      database: '数据库名'
    });
    
    const [rows] = await connection.execute(`SELECT countries.id, countries.country_name, 
      Json_object("start", start_port, "end", end_port) ten_minutes, 
      Json_object("start", start_port + 10000, "end", end_port + 10000) one_minutes, 
      Json_object("start", start_port + 20000, "end", end_port + 20000) thirty_minutes 
    FROM countries JOIN countries_port_ranges ON country_id = countries.id;`);
    
    // rows里的ten_minutes等字段已经是解析好的JSON对象了
    console.log(rows);
    await connection.end();
  } catch (err) {
    console.error(err);
  }
}

fetchCountries();

这样处理后,你就不会再看到带反斜杠的转义字符串,直接就能操作JSON对象里的start和end属性啦!

内容的提问来源于stack exchange,提问作者DavidA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:19:17