Sequelize:使用findAll时将JSON列转换为对象的方法
解决Sequelize查询时JSON字段返回字符串的问题
针对你遇到的MySQL longtext 列在Sequelize模型定义为DataTypes.JSON,但findAll返回data为JSON字符串而非对象的问题,有以下几种可行方案:
方案一:给模型字段添加Getter函数
在page模型的data字段定义中,添加自定义getter,自动将存储的JSON字符串解析为对象:
module.exports = (sequelize, DataTypes) => { const Page = sequelize.define('Page', { // 其他字段... data: { type: DataTypes.JSON, get() { const rawValue = this.getDataValue('data'); return rawValue ? JSON.parse(rawValue) : null; }, set(value) { // 显式确保存入时为JSON字符串(兼容Sequelize自动处理逻辑) this.setDataValue('data', JSON.stringify(value)); } } }); return Page; };
该方案的优势是所有查询操作(findAll、findByPk等)都会自动解析data为对象,无需在每次查询时额外处理。
方案二:确保查询不使用raw: true
当查询设置raw: true时,Sequelize会直接返回数据库原始结果,不会自动解析JSON字段。如果你的查询代码中存在该配置,移除即可:
const pages = await Page.findAll({ // 不要设置 raw: true(默认值为false) where: { /* 你的查询条件 */ } });
若Sequelize版本较新且模型定义正确,默认的raw: false模式会自动完成JSON字符串到对象的解析。如果无效,建议检查Sequelize版本是否兼容MySQL JSON类型的自动解析逻辑。
方案三:查询时用cast函数强制转换
在findAll的attributes配置中,使用Sequelize的cast函数将data字段转换为JSON类型:
const { cast, col } = require('sequelize'); const pages = await Page.findAll({ attributes: [ 'id', // 其他需要返回的字段 [cast(col('data'), 'JSON'), 'data'] ] });
这种方式适合临时场景,无需修改模型定义即可完成单次查询的字段转换。
内容的提问来源于stack exchange,提问作者hretic
相关产品推荐
相关产品推荐

