前端的即時驗證是 UX,後端重驗才是 gate
主張:兩層驗證要有明確分工——前端即時驗證負責回饋,後端在寫入前完整重驗負責保證。前端說什麼一律不採信。
| 時機 | 送什麼 | 目的 | |
|---|---|---|---|
| 即時驗證 | cell blur + debounce | 單列 JSON | 當下就看到錯 |
| 最終提交 | 按下送出 | 整份資料 | 最終把關,任何一列有錯就擋掉整批 |
即時驗證的觸發條件值得設計:blur 才送(打字過程不送)、欄位白名單、同一列 debounce 合併、停用的列跳過。
為什麼提交時還要全部重驗
不是因為即時驗證漏掉了某些列,而是:
- 前端不可信 — 資料在使用者的機器上,可以被改;上傳的檔案是不可信輸入
- 有些規則單列驗不出來 — 跨列、跨資料表、需要查資料庫的規則
- 時間差 — 從驗證到提交之間,資料庫狀態可能已經變了(別人改了主檔、係數換版)
- 它是寫入前的最後一道 — 全有全無比部分寫入好收拾
一個容易被忽略的缺口
即時驗證如果只送「這一列」,那些需要關聯資料才能判斷的規則就驗不到(例如該主檔底下的明細還沒接上來,payload 裡是空的)。這種缺口不會報錯,只會讓使用者以為全綠、送出後才被擋——值得在程式碼裡標記成待補,而不是當成已完成。