记一次前后端联调的诡异bug

550 阅读2分钟

这天,公司的前端程序猿小明正在吃着火锅唱着歌,欢快地跟后端开发小刚联调接口。页面其实也不难,在个人空间显示一个历史记录列表,然后列表的每个item都可以对应地操作。就像这样:

轻车熟路驾轻就熟举重若轻的小明轻而易举轻描谈写轻松愉快地实现了页面逻辑,然后点击“下载试卷”准备见证奇迹,然而奇迹并没有发生。

小明隔着工位对对面的小刚喊道:“你的下载接口有问题!”

小明的言辞冒犯了小刚作为一个后端的尊严,小刚抑制住了一闪而过的多个念头——“ 你的环境才有问题”、“**你会用吗”,耐着性子检查了一遍自己的逻辑,回复道:“没毛病啊,你把id给我”。

小明从内部IM扔过去一串数 76154831290589340。id的生成是随机的,像这个bug一样混沌而无规律。

小刚:“你这id在库里不存在。”

小明:“怎么可能,你返回给我的”。

小刚:“胡说,我给你的明明是76154831290589341。”

……

此处略去互相扯皮二百字。

接下来,二人友好地坐到了一起,开始见证奇迹。

小明:“你看,这是网络请求的返回,诶,等等,为啥结尾是41?”(打脸声)

小明尝试继续挣扎:“不对啊,你看渲染出来的页面,见鬼了。”

一顿操作中,小明不小心点中了开发中工具Network中Preview栏,更加诡异的现象出现了:

明明是同一个请求,Preview里跟Response里还不一样。这究竟是因为道德的扭曲还是人性的沦丧!?小明不禁陷入了深思。

在旁观摩良久的小刚说:“我有一个大胆的想法。”于是他接过页面控制台,打出了惊世骇俗的一个表达式,这个发现足以颠覆现代数学的基础。(误)

到这之后事情变得简单了,根本原因是后端将id类型定义为long,所以这个数在后端眼里并未超出范围。但是对于Javascript,number类型的大整数超出2的53次方(9007199254740992)就会出现不精确的问题。解决方法也很简单,response中改为返回string即可。

伴随着《走近科学》的结束曲,小明和小刚渐渐平静了下来,重新投入到了日常的开发之中。夕阳斜斜地照进来,工位上一片金黄。组里的其它小伙伴们,正在辛勤地为智云平台的建设添砖加瓦。

一个来自有道智云的程序员:ai.youdao.com