一、存在问题
问题:
系统后台使用MyBatisPlus默认的雪花算法生成的19位ID,但是请求展示到前端后ID变了,导致根据ID编辑记录时无法在数据库中找到记录更新 。
通过postman调用返回的id值是没有问题的,这可以排除后台问题;
排查:
打开浏览器控制台查看对应的网络请求发现也没问题;
对axios请求响应拦截的返回数据进行打印,id就变了;
二、问题原因
由于JavaScript中表示整数有一定的范围限制,整数范围由Number.MIN_SAFE_INTEGER和Number.MAX_SAFE_INTEGER定义,这两个常量分别表示了JavaScript中可以安全表示的最小整数和最大整数。
最小整数:
-9007199254740991
最大整数:
9007199254740991
超出这个范围的整数可能会失去精度。
在Axios中,使用了JSON.parse()函数用于将JSON字符串转换为对应的JavaScript值,其中的数字会被转换为JavaScript中的数字类型,这就造成了精度丢失。
如下示例:
const a = '{"id":1768525468355010562}'
JSON.parse(a)
// 转换后的值
{id: 1768525468355010600}
三、解决方法
1、安装json-bigint
在vue项目中安装该插件npm i json-bigint
2、Axios创建实例修改
在创建axios实例时进行修改 页面引入插件
import bigIntJSON from 'json-bigint'
修改创建实例,添加transformResponse参数
const ReqInstance = axios.create({
timeout: 1800000,
transformResponse: (data) => {
try {
return bigIntJSON.parse(data)
} catch (err) {
console.log(err)
return JSON.parse(data)
}
}
})