地铁里填完反馈点提交,页面弹出 Failed to fetch,返回后重新填写,之前那两百多字全没了,IndexedDB 里也查不到草稿。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

await db.put('outbox', {id: crypto.randomUUID(), body, ts: Date.now()});
if (navigator.onLine) await flushOutbox();

提交逻辑直接 fetch,没有本地落库这一步,网络失败就什么都没留下。输入过程中也没有存草稿,页面一刷新内容就清空。这一点先确认清楚,后面就不用反复试。

「离线表单丢失」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,提交时先把表单序列化写进 IndexedDB,标记为待发送;有网就立刻发,成功后删记录,失败保留并在下次进入时补发;输入框加防抖监听,每五秒存一次草稿。

改完照着核一遍,断网提交后刷新页面,草稿仍在输入框里,恢复网络十秒内自动发出并从队列消失。

作者 9823189