Nodejs kaojs 架构,读取 mysql 的 json 类型字段时,能否自动转换成 json 类型,而不是 string 类型?
Nodejs kaojs 架构,读取 mysql 的 json 类型字段时,能否自动转换成 json 类型,而不是 string 类型?
目前有个系统,架构是 koa+mysql(历史原因,没有使用 mongdb),为了便于扩展,mysql 表里面用了很多类似名为 detail/tags 的 json 类型字段.
例如有个 users 表,包含了 tags 字段,保存该用的额 tag, 例如['可爱','型男','80 后']等数据.在 koa 读取这个用户的时候:
const user = await this.model('users').where({id: 1}).find();
读取的结果,user.tags 是一个 string 类型的值,而不是标准的 json array. 当然手工可以转换成 json,但是如果字段多的话,就会很累.
刚刚接触 nodejs,不知道有没有自动化的处理方法,让框架能自动识别 model 中的 json fields 类型,自动转换成 json 类型?
mysql 5.7 已经支持 json 类型的字段了不过不支持索引,并且提供的有 json 相关的函数, 用起来还可以.
暴力一点的方法可以 hack 一下原型链,找到 find 方法对应的构造函数,然后在原型上添加一个方法,大概就像这个样子:
XXX.prototype.findAndConvertToArray = async function () {
const stringValue = await this.find()
return JSON.parse(stringValue)
}
在原型链上添加方法之后就可以像 find 一样调用 findAndConvertToArray 方法了。不过记得给新增的方法加上注释,防止别人不理解。
是的,目前采用的就是这种办法. 原以为 koajs 之类的框架,应该有自动 convert 的 feature,看来没有了
可以看看 typeorm 里有没有好的方案,converter 或者 mapper 之类的。
多谢 我们看下, 和 Laravel 的 Doctrine 还是比较类似的
在 Node.js 中使用 Koa.js 架构读取 MySQL 数据库中的 JSON 类型字段时,默认情况下 MySQL 驱动(如 mysql
或 mysql2
)可能会将这些字段作为字符串返回。不过,你可以通过一些处理来自动将这些字符串转换为 JavaScript 对象。
以下是一个使用 mysql2
驱动的示例,它支持直接将 JSON 字段转换为 JavaScript 对象:
- 安装
mysql2
驱动:
npm install mysql2
- 配置 Koa.js 和 MySQL 连接,并处理 JSON 字段:
const Koa = require('koa');
const mysql = require('mysql2');
const app = new Koa();
const connection = mysql.createConnection({host: 'localhost', user: 'root', password: 'password', database: 'test'});
app.use(async ctx => {
connection.query('SELECT json_field FROM your_table WHERE id = ?', [1], (error, results, fields) => {
if (error) throw error;
// Assuming json_field is a JSON type in MySQL
results.forEach(row => {
try {
row.json_field = JSON.parse(row.json_field);
} catch (e) {
console.error('Failed to parse JSON:', e);
}
});
ctx.body = results;
});
connection.end();
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
在这个例子中,我们查询了 json_field
,然后尝试将其从字符串解析为 JSON 对象。如果解析失败,会捕获异常并打印错误信息。这样,你就可以在 Koa.js 应用中处理 MySQL 的 JSON 类型字段了。