2026-10-31 · 土拨鼠动态

土拨鼠日志:校验显示成功,保存却没生效

今天遇到一个特别典型的问题,值得写下来:界面上每一步都提示成功,最后结果却不对。用户点「校验账号期限」,弹窗里清清楚楚显示读到了新日期;点确认保存;退回列表一看——还是旧的。再进去重复一遍,这回又对了。

这种「第二遍才成功」的毛病最折磨人,因为它不像坏了,像你手慢。下面把排查过程原样摊开,方法和结论都能直接搬去别的系统用。

一、先别改代码,先证明谁在说谎

「保存没生效」天然有三种可能:数据库没写进去、后端收到了旧值、前端压根没提交新值。凭感觉猜会连着改三处,全是白改。

真正快的办法是翻提交记录:系统每次保存都会留一条请求日志,把两次提交的内容拉出来对比。

结论就出来了:后端一直是对的,问题在前端没把新值交上去。这一步省下的时间,比后面所有调试加起来都多——不然很容易去查数据库连接、查缓存、查权限,查一整天。

顺带一个容易踩的坑:同一台机器上常常跑着不止一个数据库实例。查之前先确认配置文件里连的是哪个端口,不然你会得出「这条记录不存在」这种假结论,然后开始怀疑人生。

二、真凶:刷新列表把刚读到的值清空了

把前端代码摊开,链路是这样的:

于是:读到的 2027 被 300 毫秒后的那次刷新悄悄擦掉,保存时提交的自然是 2026。提示成功是真的,值被吃掉也是真的——两个事实同时成立,用户就看到一个自相矛盾的界面。

为什么第二次能成?因为手快,赶在刷新清空之前点了保存。这也解释了为什么这种 bug 从测试到上线都没人复现——它跟手速有关。

经验一句:别在「操作成功」的提示之后立刻强制刷新表单所在的那一屏。现代前端框架的表单重新挂载会丢掉你刚写进去的临时状态。要刷列表,就换页、或者等保存真正完成之后再刷。

三、改四处,而不是改一处

只把「挂载时清空」那句删掉,能好一半,但会带来新问题:临时变量留着不清,用户校验完 A 账号却去保存 B 账号,B 就会被写上 A 的日期。这类「串号」比原来的 bug 更危险,因为它不报错。

所以一共改了四件事:

改完还做了一次「清空点审计」:全文搜索这个临时变量,确认它只出现在三个地方——保存时读、校验时写、改账号时作废,没有第四处偷偷清它。这一类 bug 的复发,往往就藏在没人记得的第四处。

四、验收:把真实代码抽出来跑四个用例

界面上点一遍不算验收,因为「看着对了」和「逻辑对了」是两件事。做法是把线上那份保存函数原样抽出来,配一个假的运行环境,直接喂输入看输出:

四个全过,才算修完。最后一个用例是用户没提过的相邻场景——只验用户说的那一个,等于只验了一半。

五、同一类病的另一半:状态为什么说两套话

巧的是今天还修了另一个「自相矛盾」:会话列表的灯说这条已经结案,气泡上的章却说还在跑命令。根因也一样——同一个事实被两个地方各算了一遍,一处算错就打架。

具体错在一条判定规则的正则:中间那段分隔符写成了「可以出现零次」,于是它总能退到零个字符,后面的否定条件就永远成立。结果凡是结尾写着「没有需要你做的事」的正常结案,全被判成「正在等用户回话」。

修法是只算一次,三处共用:列表灯、气泡章、后台重试都用同一个结论——真在跑就是跑命令中,在等你回话就亮黄,明确结案就是绿,不再有第四种答案。另外顺手给每条回话补上了具体完成时间(年月日时分),以前只记「耗时多少毫秒」,翻历史根本分不清是哪天的事。

六、可以带走的三条

这类打磨不会出现在功能列表里,但你每天用的时候能感觉到:界面不再自相矛盾,时间不再错位。想看看土拨鼠现在都能干什么,可以去功能一览翻翻;想了解不同版本怎么选,版本与价格那页写得很清楚;想直接在自己机器上试,下载页一分钟就能装好。

← 返回动态列表 · 回官网首页