前言
写这篇文章之前,因为一个 bug 差点奔溃,尽折腾了几个小时。如今想起来,感觉是自己在解决问题的过程还是有些浮躁。在一个项目中,大概是要实现这样的一个功能: 获取微信用户,然后在榜单显示用户的昵称。
解决问题的过程
在一个惬意的午后,终于顺利的完成了一个小游戏的项目,准备伸伸懒腰。运维同事也把代码部署到了生产环境,然而在做回归测试时,突然发现这个榜单打不开了,我去,High bug 啊,吓得冒冷汗。
问题一下子就定位到了,ajax 发生错误,然后打印一下 error 信息,抛出的是 parseError 错误,难道是服务端返回的数据有问题?好,那我打印一下XMLHttpRequest.responseText,看起来输出的像是一个标准的 json 格式啊。然而为了谨慎一点,还是用工具检验一下:valid JSON。这下懵逼了吧。
再仔细观察下,游戏榜单里有某些用户昵称 emoji 表情做昵称,难道是 emoji 表情导致的?好,那尝试导入没有带 emoji 表情的数据,果然可以访问榜单的数据了,好嗨森啊!为了验证我的猜想是否正确,我又在昵称加回了一些 emoji 表情。诡异的事发生了,榜单居然还能正常打开!!!我又再一次懵逼了?难道不是 emoji 表情导致的?继续调试,我把之前的 emoji 的数据全部导回去。是的,榜单终于不能打开了,大胆猜想了一下,难道是有些 emoji 会导致 ajax 错误?
最后经过反复调试发现,一些新的 emoji 表情,不能被储存到数据库,至少在数据表里面没有看到,而旧版本的 emoji 是有字符的,在数据库是 “☕”这种字符,我猜测,可能数据库不支持这种非法表情的编码字符,具体是什么原因我也不清楚,找了一些资料。
解决方案
服务端 encode 一下用户的昵称,前端 decodeURIComponent 一下昵称即可。这样就能通过 ajax 的 json 检验了,搞定!
总结
这篇也不算什么技术文章,算是反省自己处理问题时的态度,遇到问题,一定要先冷静。排除 bug 一定要,一步两步,一步一步似爪牙。
[本文谢绝转载,谢谢]