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

为何Mikro-ORM返回的数字以字符串形式呈现?

解决Bigint属性返回字符串而非数字的问题

针对你遇到的postsCount属性定义为数字但实际返回字符串的问题,这里有几个可靠的解决方法,能覆盖包括直接返回修改后实体在内的各种场景:

1. 实体类中使用Getter/Setter封装

直接在User实体里通过getter和setter实现类型转换,这样不管是从数据库加载还是手动修改实体后返回,外部访问该属性时都会拿到数字类型:

// 将原始字段设为私有,存储数据库返回的字符串
@Property({ columnType: 'bigint', nullable: false, default: 0 })
private _postsCount: string;

// 对外暴露的getter,自动转成数字
get postsCount(): number {
  return parseInt(this._postsCount, 10);
}

// 对外暴露的setter,接受数字并转成字符串存储
set postsCount(value: number) {
  this._postsCount = value.toString();
}

这种方式不需要依赖序列化器,任何访问postsCount的地方都会自动处理类型转换。

2. 使用ORM自带的类型转换器(推荐)

如果使用的是TypeORM、MikroORM这类ORM框架,它们都支持自定义类型转换器,在实体映射阶段自动完成数据库值和实体属性值的转换,属于框架层面的处理,不会被业务代码绕过:

MikroORM示例

// 定义转换器类
class BigIntToNumberConverter {
  toDatabaseValue(value: number): string {
    return value.toString();
  }

  toEntityValue(value: string): number {
    return parseInt(value, 10);
  }
}

// 在实体属性上应用转换器
@Property({ 
  columnType: 'bigint', 
  nullable: false, 
  default: 0,
  converter: new BigIntToNumberConverter()
})
postsCount: number;

TypeORM示例

@Column({
  type: 'bigint',
  nullable: false,
  default: 0,
  transformer: {
    // 存到数据库时转成字符串
    to: (value: number) => value.toString(),
    // 从数据库读取时转成数字
    from: (value: string) => parseInt(value, 10)
  }
})
postsCount: number;

3. 注意精度问题

如果postsCount的数值可能超过JavaScript Number的精度上限(约9007199254740992),那转成Number会丢失精度,此时建议:

  • 保留字符串类型,或者改用BigInt类型存储和返回
  • 前端处理时使用BigInt兼容逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:53:23