vue项目通过json-bigint在前端处理java雪花id过长导致失去精度问题

2023-09-18 02:04:33

这里 我简单模仿了一个接口
在这里插入图片描述
这里 我单纯 返回一个long类型的雪花id
然后 前端 用 axios 去请求
在这里插入图片描述
大家知道 axios 会对请求数据做一次处理 而我们 data才是拿到我们java这边实际返回的东西 简单说 就是输出一下我们后端返回 的内容

这里 我们网络中显示的是 358661018680954880
在这里插入图片描述
但神奇的一幕 发生了 我们实际输出的是 358661018680954900
在这里插入图片描述
这个问题 我之前的文章也解释过 这叫 java雪花id超长 导致前端接受失去精度
因为 前端js的数字类型 number 最大容量小于 java的long
导致 无法负载的值被四舍五入了
我之前说过 后端解决 直接转字符串即可
但其实 前端也可以通过第三方插件 json-bigint来处理此问题
我们还是先安装依赖
终端输入

npm install json-bigint

在这里插入图片描述
然后 我们可以修改一下发送请求的代码

<script>
import axios from "axios";
import JSONbig from 'json-bigint';

export default {
  name: 'App',
  data(){
    return {
    }
  },
  created(){
    axios({
      url: '/books',
      headers: {
        // 可以根据需要设置请求头
      },
      // 使用transformResponse选项将响应数据进行自定义处理
      transformResponse: [(data) => {
        // 使用JSONbig对返回的数据进行处理
        return JSONbig.parse(data);
      }]
    }).then(res => {
      console.log(res.data);
    }).catch(error => {
      console.log(error);
    });
  },
}
</script>

简单说 就是 在axios的transformResponse中 用json-bigint提供的parse函数去处理一下
这样 我们返回的内容如果过程 他就会帮我们分段处理
在这里插入图片描述
放不下 他会帮我们分成数组
在这里插入图片描述
例如 一个对象中 id超长 那么 原来的id字段就会变成一个这样的数据 放不下就帮你分成两个数组下标 到时 你自己再拼合一下就好了

然后 我们想将数据传回给后端 我们可以先将他们处理成字符串
例如 我们将 then 函数中的内容改成这样

let id = res.data.c.join("");
console.log(id);

我们 拿到 c的数组
然后 将他拼成字符串
我们运行项目 看网络
在这里插入图片描述
然后看控制台
在这里插入图片描述
然后 这里一个知识点 BigInt js另一个种数字类型 而他的容量是要比Number大的
我们引入一下第三方依赖

npm install big-integer

然后 我们将代码改成这样

<script>
import axios from "axios";
import JSONbig from 'json-bigint';
import bigInt from 'big-integer';

export default {
  name: 'App',
  data(){
    return {
    }
  },
  created(){
    axios({
      url: '/books',
      headers: {
        // 可以根据需要设置请求头
      },
      // 使用transformResponse选项将响应数据进行自定义处理
      transformResponse: [(data) => {
        // 使用JSONbig对返回的数据进行处理
        return JSONbig.parse(data);
      }]
    }).then(res => {
      let id = res.data.c.join("");
      id = bigInt(id);
      console.log(id);
    }).catch(error => {
      console.log(error);
    });
  },
}
</script>

这里 我们用big-integer处理超长数字类型的数据
运行结果如下
在这里插入图片描述
这里这个value 就是我们要的东西了

但其实 如果你想把id还给后端 就不需要big-integer了
我们直接换字符串 后端的long 会自动转换的 例如 这里我们写个属性类
在这里插入图片描述
就一个字段 是个long类型的id字段
然后我在写个接口
接收前端传过来的 一个 属性类对象 就是只有一个long id字段的属性类的对象
在这里插入图片描述
然后 前端直接改成这样

<script>
import axios from "axios";
import JSONbig from 'json-bigint';
//import bigInt from 'big-integer';

export default {
  name: 'App',
  data(){
    return {
    }
  },
  created(){
    axios({
      url: '/books',
      headers: {
        // 可以根据需要设置请求头
      },
      // 使用transformResponse选项将响应数据进行自定义处理
      transformResponse: [(data) => {
        // 使用JSONbig对返回的数据进行处理
        return JSONbig.parse(data);
      }]
    }).then(res => {
      let id = res.data.c.join("");
      axios.post('/books', { id: id })
      .then(res => {
        console.log(res.data);
      })
      .catch(error => {
        console.log(error);
      });
    }).catch(error => {
      console.log(error);
    });
  },
}
</script>

这里 我们处理成字符串后 马上就调用 post请求 将字符串id仍会给了后端
那么 我们这个id是字符串类型的 而java属性类中是用 long接的
能行吗?
我们直接运行
在这里插入图片描述
前端控制台 可以看到传了一个对象 其中有一个字段 字符串的id
我们看java控制台
在这里插入图片描述
很明显 他已经自动帮我们 让字符串变成 long了

更多推荐

SpringMVC常用注解

除了@PathVaribale请求方式的不同,要用在方法上,其他注解都用在参数上@RequestMapping,@ResponseBody既可以注解在类上,也可以注解到方法上。目录一.@RequestParam二.@RequestBody三.@PathVaribaleRestful风格Restful风格如何实现缓存机制

新能源汽车运行安全性能检验规程需要哪些CAN数据才符合标准

新能源汽车的前生命周期包括了整车制造、使用、转让市场及报废回收这几个主要阶段,在政策大力扶持下,国内新能源汽车的制造产业链完善,补贴培育市场取得丰硕的果实。目前来说,我国新能源汽车有着技术领先、设计先进、低成本优势,在全球范围内都具备很大的吸引力。纯电动汽车及电车技术的出现和发展,实现了国内新能源汽车弯道超车,跨越了百

Opencv之区域生长和分裂

区域生长1.基本原理区域生长法是较为基础的一种区域分割方法它的基本思想我说的通俗些,即是一开始有一个生长点(可以一个像素也可以是一个小区域),从这个生长点开始往外扩充,扩充的意思就是它会把跟自己有相似特征的像素或者区域拉到自己的队伍里,以此壮大自己的势力范围,每次扩大后的势力范围就是一个新的生长点,一直生长一直生长,直

Matlab进阶绘图第30期—冲击图

冲击图是一种特殊的堆叠柱状图。与堆叠柱状图相比,冲击图添加了相邻柱子中相同组分之间的连线,可以更加清晰地表达各组分占比情况。由于Matlab中未收录冲击图的绘制函数,因此需要大家自行解决。本文使用自制的Fbarstacked小工具进行冲击图的绘制,先来看一下成品效果:特别提示:本期内容『数据+代码』已上传资源群中,加群

cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别

cmake定义的target有两个名字类似的属性:POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE,本文说明它们的含义和区别-fPIC介绍POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDE

matlab读写json文件

Background通常,在matlab中使用mat文件进行数据存储。MAT文件是MATLAB中用来存储数据的二进制文件格式。MAT文件可以包含各种数据类型,包括数字、矩阵、向量、结构体、字符和函数等。但是,当和其他语言有交互时,mat文件会不太方便。而json格式在许多编程语言中,包括MATLAB,都有提供解析和创建

【LQR】离散代数黎卡提方程的求解,附Matlab/python代码(笔记)

LQR的核心是设计QRN,并求解对应的黎卡提方程对于连续状态空间方程系统,先求连续LQR后离散和先离散后求离散LQR方程的结果是不一样的1.离散代数黎卡提方程注:LQR算法中含N项离散系统:在matlab里有现成的函数dlqr(),但为了搞清楚其内核,编写matlab代码展示其求解过程matlab帮助文件里的dlqr(

淘宝拍立淘插件转链和商业化图片生成接口介绍,图片搜索商品接口,按图搜索接口,图片识别商品接口介绍

淘宝拍立淘是淘宝网推出的一种搜索方式,通过拍立淘,用户可以输入文字描述或上传图片来搜索商品。拍立淘通过与淘宝网进行数据接入和授权,使用淘宝提供的API获取商品信息和操作权限,拍立淘使用图像识别技术,通过深度学习算法和计算机视觉技术,对用户拍摄的商品照片进行识别,拍立淘插件转链API用于为淘宝客提供开启拍立淘插件(根据图

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络预测股票价格研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述基于改进莱维飞行和混沌映射的粒子群优化BP神经网络

SunTorque亮相GAF2023数字化智能装配工程与装备技术大会

智能扭矩系统-智能拧紧系统-智能扭矩控制-SunTorqueGAF2023数字化智能装配工程与装备技术大会在中国上海汽车会展中心盛大开幕,青创智通与装配领域、智能制造、数字化应用等相关先进智造技术的知名企业一齐亮相。本次展会,我们带来了扭矩相关解决方案,包含智能扭矩系统软件、工具存储设备、扭矩校验设备、智能手持终端、扭

neo4j下载安装配置步骤

目录一、介绍简介Neo4j和JDK版本对应二、下载官网下载直接获取三、解压缩安装四、配置环境变量五、启动测试一、介绍简介Neo4j是一款高性能的图数据库,专门用于存储和处理图形数据。它采用节点、关系和属性的图形结构,非常适用于表示和查询复杂的实体关系。Neo4j具有高性能、事务支持、可扩展性和直观的Cypher查询语言

热文推荐