使用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
相关产品推荐
相关产品推荐

