爱好选了三个,提交后详情页只显示最后一个。前端打印载荷,那个字段只有一个字符串,另外两个选项不知道去哪了。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

const data = {};
for (const [k, v] of new FormData(form)) {
  if (v === '' || (v instanceof File && !v.name)) continue;
  data[k] = k in data ? [].concat(data[k], v) : v;
}

Object.fromEntries 遇到重复键会后者覆盖前者,多选字段本来就是同名多条。中间还夹着空文件输入,转出来的对象里混进了空 File。这一点先确认清楚,后面就不用反复试。

「表单序列化丢字段」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,遍历 entries 自己组装,同一个键出现多次就收成数组;跳过值为空字符串和空文件的项;需要提交文件时别转 JSON,直接用 FormData 发。

改完照着核一遍,勾选三个爱好提交,接口收到长度为三的数组,详情页三项都在。

作者 9823189