一个运算符的差异,导致千万用户头像集体“失联”——这起由代码逻辑错误引发的线上事故,昨日在知名社交平台“悦联”上演,引发热议。
“打开App,所有人的头像都变成了空白方块,我还以为手机坏了。”用户李先生在社交媒体上吐槽。昨日晚间,悦联(YueLink)用户陆续反映,自己及好友的头像全部无法正常显示,页面中只留下灰白色的占位符。更诡异的是,部分用户的头像甚至被替换成了数字“0”或空白字符串,而少数用户则意外看到了别人的默认头像。一时间,“悦联头像挂了”迅速登上热搜。
事故源于一行代码中的逻辑混淆。
经过数小时的紧急排查,悦联技术团队在今日凌晨发布事故说明:问题根源出在头像加载模块中一个微小的运算符使用错误。
在JavaScript中,??(空值合并运算符)和||(逻辑或运算符)都能用于设置默认值,但行为截然不同。||会将所有“假值”(如0、""、false、null、undefined)视为无效,进而返回右侧的默认值;而??仅对null或undefined生效,其他假值(如0或空字符串)会被当作有效数据直接使用。
“我们的数据库中有大量历史数据,用户头像字段保存的是CDN图片ID,但部分早期注册用户的头像ID为0(代表无自定义头像),还有不少账户的头像字段为空字符串""。”悦联高级工程师张明(化名)解释,“开发人员原本想用||来统一处理:如果用户没有自定义头像(即字段为0、""或null),就取用默认头像。但上周一次代码重构中,误将||写成了??,导致字段为0或空字符串时,??认为这有值,直接将其作为图片URL参数发送,CDN无法解析,前端自然加载失败。”
更讽刺的是,由于??仅排除null和undefined,那些头像字段恰好为null的用户反而正常显示了默认头像——造成了“少数幸存,多数瘫痪”的奇观。
影响范围:超千万用户、持续6小时。
事故从昨日17时左右开始,至当日23时30分修复版本全量推送,持续约6.5小时。据悦联官方统计,约60%活跃用户的头像显示异常,涉及全球超1200万账号。由于头像缺失,社交动态、评论区的活跃度骤降,部分即时通讯功能也因头像占位符混乱出现界面渲染卡顿。
“我们立即启用了热修复,但灰度验证时发现,直接修改线上代码可能导致缓存雪崩,只能通过全量部署新包解决。”技术团队表示,目前所有头像已恢复正常,数据无丢失。
专家警示:最贵的错误,往往藏在最基础的语法里。
这一事件引发了技术社区的广泛讨论。资深前端架构师陈磊指出,??和||的差异是许多初级开发者的易错点,但大型项目中出现如此低级的混淆,反映出代码审查和测试流程的漏洞。“如果单元测试覆盖了头像字段为0和空字符串的场景,这个bug在上线前就能被发现。”他建议团队引入类型系统(如TypeScript)和更严格的lint规则来避免类似问题。
悦联官方在致歉声明中承认,此次事故暴露了内部代码review机制对边界条件检查的缺失,并承诺将改进CI/CD流程,增设针对空值处理的专项测试用例。
一个运算符,让千万用户头像“全挂”,也给所有开发者敲响警钟:在代码世界里,差之毫厘,谬以千里。技术无小事,严谨才是最大的“默认值”。