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

Node/Express API中body-parser大整数精度丢失问题解决咨询

解决Express中body-parser解析大整数丢失精度的问题

这个问题我之前踩过坑!核心原因是JavaScript的Number类型是双精度浮点数,只能精确表示小于等于2^53(也就是9007199254740992)的整数,你那个75998243711877123明显超过了这个安全范围,所以默认的JSON.parse(body-parser底层依赖的就是它)会把它近似成一个能被精确表示的Number,也就是你看到的75998243711877120。

下面给你几个靠谱的解决办法:

方法1:使用json-bigint库替代默认解析

这是最省心的方案,专门处理JSON里的大整数场景:

  1. 先安装依赖:
npm install json-bigint
  1. 在Express里配置body-parser时,替换成json-bigint的解析逻辑:
const express = require('express');
const jsonBigInt = require('json-bigint');
const app = express();

// 覆盖默认的JSON解析器
app.use(express.json({
  parse: jsonBigInt.parse,
  stringify: jsonBigInt.stringify
}));

// 测试接口
app.post('/test', (req, res) => {
  const bigId = req.body.id;
  // 这里bigId是BigInt类型,比如75998243711877123n
  console.log(bigId.toString()); // 输出完整的75998243711877123
  // 返回给前端时记得转成字符串,不然JSON.stringify会报错
  res.send({ receivedId: bigId.toString() });
});

方法2:自定义reviver函数手动处理大整数

如果不想加额外依赖,可以给body-parser的json配置加一个reviver函数,识别出不安全的整数并转成BigInt或者字符串:

app.use(express.json({
  reviver: (key, value) => {
    // 判断当前值是否是超过安全范围的整数
    if (typeof value === 'number' && !Number.isSafeInteger(value)) {
      // 方案A:转成BigInt类型(适合需要数值运算的场景)
      return BigInt(value.toString());
      // 方案B:直接转成字符串(如果不需要后续运算,这个更简单)
      // return value.toString();
    }
    return value;
  }
}));

方法3:和前端约定传递字符串

最直接的思路:让前端把大整数以字符串的形式放到请求体里,比如:

{"id": "75998243711877123"}

这样后端解析出来就是字符串,完全不会丢精度。如果需要做数值运算,再用BigInt(req.body.id)转成BigInt类型即可。

注意事项

  • 如果用了BigInt类型,注意不要直接和Number做运算,得统一类型(比如都转成BigInt);
  • 直接JSON.stringify BigInt会报错,所以返回前端前要转成字符串,或者用json-bigint的stringify方法处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:12:04