vue axios 数字精度问题解决方法

axios 修改里面配置

transformResponse: [function transformResponse(data) {
if (typeof data === 'string') {
  try {
    let c1 = data.toString().replace(/:\d{17,}/g, ":\"@rr$&\"").replace(/@rr:\s/g, "").replace(/@rr:/g, "");
    let c2 = c1.replace(/:\d{1,}\.\d+/g, ":\"@rr$&\"").replace(/@rr:\s/g, "").replace(/@rr:/g, "");
    data = JSON.parse(c2)
  } catch (e) { /* Ignore */ }
  // try {
  //   data = JSON.parse(data);
  // } catch (e) { /* Ignore */ }
}
return data;
}],

后面在处理其他接口的时候还是遇到了一个问题,关于后端数据返回的格式.有朋友遇到过这种问题欢迎互相探讨

//http 响应 response 拦截器
axios.interceptors.response.use
    response => {
        //      console.log("请求地址:",response.config.url)
        //      console.log("接受到参数类型:",typeof(response.data))
        //      console.log("接受到参数:",response.data)

在接受到后台参数的时候看返回的是什么类型的数据,测试来就是obj和string(偶尔出现)


console.log

一开始我所有接口请求返回的数据都是obj,但是后来遇到string,至今没有弄明白为什么返回string的数据
后端同事说,可能是数字太长的问题,Java把long类型转换string传输即可。

查看vue axios中的源码node_modules/axios/lib/defaults.js

    transformResponse: [function transformResponse(data) {
        /*eslint no-param-reassign:0*/
        //console.log("接收到的数据类型:",typeof data)
        if(typeof data === 'string') {
            try {
                let c1 = data.toString().replace(/:\d{17,}/g, ":\"@rr$&\"").replace(/@rr:\s/g, "").replace(/@rr:/g, "");
                let c2 = c1.replace(/:\d{1,}\.\d+/g, ":\"@rr$&\"").replace(/@rr:\s/g, "").replace(/@rr:/g, "");
                data = JSON.parse(c2);
            } catch(e) { /* Ignore */ }
        }
        return data;
    }],

了解下axios源码这里第三行我输出的时候就是一个string,然后return的时候已经转换成json对象了。
所以,无解了,一会好也会坏的。无奈之下只有在接受的时候重新再判断一下

axios.interceptors.response.use(
    response => {
        //      console.log("请求地址:",response.config.url)
        //      console.log("接受到参数类型:",typeof(response.data))
        //      console.log("接受到参数:",response.data)
        //console.log("响应的参数类型:",typeof(response.data))
        //如果接收到的是一个string,那么就转换成json格式
        if(typeof(response.data) == "string") {
            console.log("获取参数类型",typeof(response.data), response.config.url)
            response.data = eval('(' + response.data + ')')
        }
        else{
            console.log("获取参数类型",typeof(response.data), response.config.url)
        }

又遇到类似问题的朋友欢迎一起分享下解决方案

你可能感兴趣的:(vue axios 数字精度问题解决方法)