axios处理特大数据碰到的问题
碰到问题:axios在处理服务器特大数据时如:"id": 1323890743432970240json字符串时默认使用的是JSON.parse()api进行对象转换,但问题出现了JavaScript只能精确保存安全数字内的数组 即:-2^53到2^53内的整数数据,当转换后这个数字就发生了改变,如图这是直接在浏览器console面板输入的值,发现无法精确保存这种数字,也就是用这个id获取后台数据
·
碰到问题:
axios在处理服务器特大数据时如:
"id": 1323890743432970240
json字符串时默认使用的是JSON.parse()api进行对象转换 ,但问题出现了JavaScript只能精确保存安全数字内的数组 即:-2^53
到2^53
内的整数数据,当转换后这个数字就发生了改变,如图
这是直接在浏览器console面板输入的值,发现无法精确保存这种数字,也就是用这个id获取后台数据时会发生错误,经常报404,不改的话显向就是随机的正确性,偶然保存正确,这很明显不是我们想要的效果。
解决的原理
通过算法将这种大数字转换为字符串或者是对象都写就是不能是数字,并且不可以绕过这种规则
使用第三方的包解决:
json-bigint
官方示例:
输入:
var JSONbig = require('json-bigint');
var json = '{ "value" : 9223372036854775807, "v2": 123 }';
console.log('Input:', json);
console.log('');
console.log('node.js built-in JSON:');
var r = JSON.parse(json);
console.log('JSON.parse(input).value : ', r.value.toString());
console.log('JSON.stringify(JSON.parse(input)):', JSON.stringify(r));
console.log('\n\nbig number JSON:');
var r1 = JSONbig.parse(json);
console.log('JSONbig.parse(input).value : ', r1.value.toString());
console.log('JSONbig.stringify(JSONbig.parse(input)):', JSONbig.stringify(r1));
输出:
Input: { "value" : 9223372036854775807, "v2": 123 }
node.js built-in JSON:
JSON.parse(input).value : 9223372036854776000
JSON.stringify(JSON.parse(input)): {"value":9223372036854776000,"v2":123}
big number JSON:
JSONbig.parse(input).value : 9223372036854775807
JSONbig.stringify(JSONbig.parse(input)): {"value":9223372036854775807,"v2":123}
但是使用时不能用它来计算,依旧是JavaScript无法精确保存这种大数据,其他方面都挺好用的,解决开头说的问题只需要在axios中配置一下就行,用到了transformResponse这个配置属性:
import JSONBig from 'json-bigint'
const res = axios.create({
// 接口的基础连接
baseURL: 'http:// www.xxxxx.com/',
// 自定义返回的元素数据,axios会默认用JSON.parse
// `transformResponse` 在传递给 then/catch 前,允许修改响应数据
transformResponse: [
function (data) {
// 对 data 进行任意转换处理
try {
return JSONBig.parse(data)
} catch (err) {
return data
}
}
]
})
更多推荐
已为社区贡献1条内容
所有评论(0)