Node.js使用Sequelize查询数据库时数值字段全部返回字符串如何解决
解决方案
1 修正模型字段类型定义
你当前代码中所有需要返回数值的业务字段(product_category_id、product_sub_category_id、min_order_qty、business_margin、discount_percentage、stock等)均被错误定义为Sequelize.TEXT类型,Sequelize会严格按照模型定义的类型做结果转换,这是问题的核心原因。
请将上述字段的类型替换为对应数值类型,示例修改如下:
product_category_id: { type: DataTypes.INTEGER // 字段值如果超过INTEGER上限可替换为DataTypes.BIGINT }, product_sub_category_id: { type: DataTypes.INTEGER }, min_order_qty: { type: DataTypes.INTEGER }, business_margin: { type: DataTypes.INTEGER }, discount_percentage: { type: DataTypes.INTEGER }, stock: { type: DataTypes.INTEGER },
2 解决BIGINT默认返回字符串的驱动问题
你定义为DataTypes.BIGINT的id、user_id字段,即使模型定义正确,默认也会返回字符串。这是因为Node.js原生Number类型的精度上限为253-1,而BIGINT的精度上限为264-1,超出精度的数值直接转换会丢失精度,因此mysql等数据库驱动默认将BIGINT转为字符串返回。
如果你确认业务中BIGINT字段的取值不会超过2^53-1(9007199254740991,绝大多数业务场景都不会超出),可以在Sequelize初始化时添加以下配置,自动将BIGINT转为Number类型:
const sequelize = new Sequelize('数据库名', '账号', '密码', { host: '你的数据库地址', dialect: 'mysql', dialectOptions: { supportBigNumbers: true, bigNumberStrings: false } })
3 临时兼容方案(不推荐)
如果暂时无法修改模型定义,可以给字段添加自定义getter,手动转换类型,示例如下:
id: { type: DataTypes.BIGINT, autoIncrement: true, primaryKey: true, get() { return Number(this.getDataValue('id')) } }
内容的提问来源于stack exchange,提问作者Jeffin Poulose
相关产品推荐
相关产品推荐

