前端传参数跟后端参数不一致
终极管理员 知识笔记 74阅读
eg: 后端返回 id 10976458979374929
前端获取到的: 10976458979374928
原因:
js 中 Number类型范围-2^53 1 到 2^53 - 1
Number.isSafeInteger()用来判断一个整数是否落在这个范围之内。

java中 Long 类型的取值范围是-2^63 1 到 2^63 - 1, 比JavaScript中大很多所以后端能正常处理。
解决方法:
方式1数据库中存的就是数值型修改数据库存的类型为字符串
方式2返回接口时转为字符串类型给前端

方式1:
如果我们使用的是axios请求数据Axios 提供了自定义处理原始后端返回数据的 APItransformResponse , 可以这样处理
axios({ method: method, url: url, data: data, transformResponse: [function (data) { // 将Long类型数据转换为字符串 const convertedJsonString data.replace(/(\w):(\d{15,})/g, $1:$2); return JSON.parse(convertedJsonString); }], })// 假设后端返回的JSON数据如下const responseData { id: 12345678901234567890, // 这是一个Long类型数据 name: John Doe};// 处理过的json数据console.log(responseData.id); // 这将输出字符串12345678901234567890console.log(typeof responseData.id); // 这将输出 string
方式2 : json序列化处理
使用JSON.parse()转换为JS对象但是由于JS的Number的范围为超出安全整数范围无法精确表示。
我们可以借助json-bigint这个第三方包来处理。
json-bigint中的parse方法会把超出 JS 安全整数范围的数字转为一个 BigNumber
类型的对象对象数据是它内部的一个算法处理之后的我们要做的就是在使用的时候转为字符串来使用。
通过启用storeAsString选项,可以快速将BigNumber转为字符串代码如下
import JSONbig from json-bigint; axios({ method: method, url: url, data: data, transformResponse: [function (data) { const JSONbigToString JSONbig({ storeAsString: true }); // 将Long类型数据转换为字符串 return JSONbigToString.parse(data); }], }) // 假设后端返回的JSON数据如下 const responseData { id: 12345678901234567890, // 这是一个Long类型数据 name: John Doe }; // 处理过的json数据 console.log(responseData.id); // 这将输出字符串12345678901234567890 console.log(typeof responseData.id); // 这将输出 string
标签: