土拨鼠日志:校验显示成功,保存却没生效
今天遇到一个特别典型的问题,值得写下来:界面上每一步都提示成功,最后结果却不对。用户点「校验账号期限」,弹窗里清清楚楚显示读到了新日期;点确认保存;退回列表一看——还是旧的。再进去重复一遍,这回又对了。
这种「第二遍才成功」的毛病最折磨人,因为它不像坏了,像你手慢。下面把排查过程原样摊开,方法和结论都能直接搬去别的系统用。
一、先别改代码,先证明谁在说谎
「保存没生效」天然有三种可能:数据库没写进去、后端收到了旧值、前端压根没提交新值。凭感觉猜会连着改三处,全是白改。
真正快的办法是翻提交记录:系统每次保存都会留一条请求日志,把两次提交的内容拉出来对比。
- 第一次(失败那次)提交的到期时间是旧值;
- 第二次(成功那次)提交的是新值;
- 数据库里的更新时间和操作人,也正好是第二次的那条。
结论就出来了:后端一直是对的,问题在前端没把新值交上去。这一步省下的时间,比后面所有调试加起来都多——不然很容易去查数据库连接、查缓存、查权限,查一整天。
顺带一个容易踩的坑:同一台机器上常常跑着不止一个数据库实例。查之前先确认配置文件里连的是哪个端口,不然你会得出「这条记录不存在」这种假结论,然后开始怀疑人生。
二、真凶:刷新列表把刚读到的值清空了
把前端代码摊开,链路是这样的:
- 校验成功后,先把读到的日期存进一个临时变量
__verifiedDate; - 紧接着 300 毫秒后,自动刷新一次列表,好让界面显示最新状态;
- 刷新列表 → 表单一带重新挂载 → 挂载时执行了一句「清空临时变量」;
- 用户接着点保存,保存函数只在临时变量有值时才覆盖日期,其他情况就读输入框里的旧值。
于是:读到的 2027 被 300 毫秒后的那次刷新悄悄擦掉,保存时提交的自然是 2026。提示成功是真的,值被吃掉也是真的——两个事实同时成立,用户就看到一个自相矛盾的界面。
为什么第二次能成?因为手快,赶在刷新清空之前点了保存。这也解释了为什么这种 bug 从测试到上线都没人复现——它跟手速有关。
经验一句:别在「操作成功」的提示之后立刻强制刷新表单所在的那一屏。现代前端框架的表单重新挂载会丢掉你刚写进去的临时状态。要刷列表,就换页、或者等保存真正完成之后再刷。
三、改四处,而不是改一处
只把「挂载时清空」那句删掉,能好一半,但会带来新问题:临时变量留着不清,用户校验完 A 账号却去保存 B 账号,B 就会被写上 A 的日期。这类「串号」比原来的 bug 更危险,因为它不报错。
所以一共改了四件事:
- 挂载时不再无条件清空,把主动权交回给业务逻辑;
- 校验成功时同时记一个指纹(账号 + 类型),标记「这个日期属于谁」;
- 保存前比对指纹,只有当前编辑的对象和校验的对象一致,才采用读到的日期;
- 手动改账号就作废已校验的日期和指纹,避免用旧校验结果覆盖新账号。
改完还做了一次「清空点审计」:全文搜索这个临时变量,确认它只出现在三个地方——保存时读、校验时写、改账号时作废,没有第四处偷偷清它。这一类 bug 的复发,往往就藏在没人记得的第四处。
四、验收:把真实代码抽出来跑四个用例
界面上点一遍不算验收,因为「看着对了」和「逻辑对了」是两件事。做法是把线上那份保存函数原样抽出来,配一个假的运行环境,直接喂输入看输出:
- 用例 1(复现旧 bug):校验后被刷新清空 → 提交旧日期。和用户截图的现象一致,说明病根找对了;
- 用例 2(修复后):校验成功直接保存 → 提交新日期;
- 用例 3(防串号):校验 A 却保存 B → 提交的是 B 自己的日期;
- 用例 4(改账号):校验后手动换账号 → 校验结果作废,提交输入框里的值。
四个全过,才算修完。最后一个用例是用户没提过的相邻场景——只验用户说的那一个,等于只验了一半。
五、同一类病的另一半:状态为什么说两套话
巧的是今天还修了另一个「自相矛盾」:会话列表的灯说这条已经结案,气泡上的章却说还在跑命令。根因也一样——同一个事实被两个地方各算了一遍,一处算错就打架。
具体错在一条判定规则的正则:中间那段分隔符写成了「可以出现零次」,于是它总能退到零个字符,后面的否定条件就永远成立。结果凡是结尾写着「没有需要你做的事」的正常结案,全被判成「正在等用户回话」。
修法是只算一次,三处共用:列表灯、气泡章、后台重试都用同一个结论——真在跑就是跑命令中,在等你回话就亮黄,明确结案就是绿,不再有第四种答案。另外顺手给每条回话补上了具体完成时间(年月日时分),以前只记「耗时多少毫秒」,翻历史根本分不清是哪天的事。
六、可以带走的三条
- 先证明谁在说谎,再改代码:翻请求日志对比两次提交,比猜十次快。
- 同一个事实只能算一次:两个地方各算一遍,迟早对不上;要么一处调另一处,要么把结论算好发出去。
- 「显示对了」不是验收:拿真实代码跑真实用例,看每一条变化是否都能解释得通。
这类打磨不会出现在功能列表里,但你每天用的时候能感觉到:界面不再自相矛盾,时间不再错位。想看看土拨鼠现在都能干什么,可以去功能一览翻翻;想了解不同版本怎么选,版本与价格那页写得很清楚;想直接在自己机器上试,下载页一分钟就能装好。
土拨鼠 Marmot