记一次狗血的修 bug 经历
没什么别的目的,写这篇就是为了提醒自己是个傻子
起因是这样的,在一个风和日丽的一天,测试给我出了这么一个 bug :
hello 啊,这个页面啊,打不开啊,我的 iPad 啊,就是点了不会动了啊,其他的都可以的啊,赶紧看一下啦
在经过漫长的沟通后,我得到了以下信息:
- ios10 的设备下某页面的登陆点击之后无法跳转。
- 安卓和 iOS11 的设备是正常的。
- 没有足够的设备的调试。
其实看到这儿,我的内心还是有点窃喜的。自上次自己解决 ios9浏览器无痕模式下浏览器 localStroage 存储失效
的问题后,我发现找这种类似的兼容性问题的过程还是挺爽的,我其实对我自己发现问题和解决问题的能力是很自信的,所以我想,我又可以秀操作了。
现在我来聊一下我的心路历程:
Q: 首先呢,我以为是前端页面报错!
因为正常的页面无法跳转,我怀疑大概率是 js 的某些逻辑出错,这在兼容性的问题上是经常出现的。但,ios 的设备调试是挺坑爹的,况且还是 ipad ,通过数据线来进行 safari 调试是行不通的,于是只能通过无线代理的方式来调试了。一顿操作,装证书、设代理,发请求,但是页面控制台真的是 空 空 空空如也
并没有 js 报错,看来并不是某些方法兼容性的问题。
又检查了一下请求,看出了一些端倪,竟然请求没有返回值。
Q: 那我觉得,应该是后端接口的问题了!
后端是用 node + koa 写的,我们的接口是这样的,前端发一个登陆请求,然后我们会去验证登陆,如果登陆成功,会在客户端写入唯一登陆的 accesstoken 到cookie中,后续的请求都需要用到这个登陆的 accesstoken。经过我一顿查找,发现了可能是cookie的写入出现了问题:使用 ctx.cookies.set('ss','bb')
并没有生效。
Q: 那么是所有的设备都没有生效吗?
为了不影响测试,我本地起了个服务,然后借用同事的 iOS10 的设备进行测试发现了同样不行(最后证明就是这一环节出了问题,是网络堵塞引起的不行)。当然安卓都是正常的。
于是我自以为是的得出了一个结论:这应该是 ios10 设备独有的一个 cookie 的 bug。
我疯狂的在 github issue 和 Stack Overflow 寻找相关的答案,有提到 写入 cookie 时使用中文字符造成写入失败的
、也有说 iOS10 的隐私策略的问题
。不过好像都与我的关系不大。
Q: 难道并不是兼容性问题?
我又重新检查了代码,最后经过一段手动测试,发现是 cookie 过期时间设置的问题。问题描述如下: 当我设置过期时间为几个小时的时间时,就不能正常写入 cookie。如果时间大于一天,就可以正常写入,也算勉强解决了。
我下意识的瞄了一下手里的iPad,时间显示是正常的(坑在此,时间是正常,但是日期不是)。我又开始怀疑是时区设置的问题,但是也是不求甚解。
Q: 好吧,估计只能抽空看下源码了……
折腾了这么个半天时间,发现了确实是 cookie 设置的问题,于是通过重新设置cookie的有效时间解决了。虽然算是勉强解决了,但是这个解决办法很让人不爽,因为我还是在迷惑的状态。就在我心如死灰的时候,我无意中打开了 ipad 的日历,发现竟然比实际多一天,但是时间却是一分一秒不差。
WTF!!!难道是日期设置的问题?
最后,测试了几次,果然是日期设置的问题。
最后,bug 终于解决了
其实问题出现的原因很简单,和什么兼容性一点关系都没有,纯粹是自己的意淫。其实就是当我设置 cookie 为一天之内的过期时间的情况,因为设备的日期时间刚好大于实际的一天,那造成的情况就是 cookie 刚写入了就因为过期被浏览器清除掉了。
真是一次令人捉急的经历!