簡體   English   中英

更新記錄時缺少可選字段值的正確明確的服務器端行為應該是什么?

[英]What should be correct unambiguous server side behavior for missing optional field values when updating a record?

我們有一個 Angular + Laravel 5 應用程序,我們試圖堅持 RESTful 設計(盡管說實話,我們沒有完全實現它)。

我注意到隨着時間的推移,我們在更新記錄時積累了一些處理可選字段的空值的不一致。 這是發生的事情:

  • 在某些情況下,程序員只是忽略了缺少可選值的事實,而只將接收到的值傳遞給 Laravel 模型。 這導致在數據庫中保留舊值不變。

  • 在某些情況下,程序員試圖變得聰明並假設 - 如果沒有收到可選字段,那么用戶可能希望用一些全局默認值(通常意味着null )填充它。 這會導致用數據庫中的默認值覆蓋舊值。 令人困惑的是 - 在某些情況下,我們的客戶針對某些特定字段明確要求這種行為 - 也就是說,如果用戶沒有向我們的 Web API 發送任何內容,我們應該用null覆蓋舊值。

  • 在某些情況下,即使可選值缺失,程序員也會嘗試防止歧義並拒絕請求(我們為此使用自定義present Laravel 驗證規則)。 如果用戶真的想用默認值填充該值,則應從 Web 表單發送顯式null (或任何默認值)。 這在更新時通常不是問題,因為 Web 表單通常已經填充了舊值,但是在保存新記錄時會變得混亂,因為 Angular 默認情況下不會將未填充的表單字段發送到服務器。 所以我們必須強制它,因此我們最終的 Javascript 模型充滿了很多模型初始化代碼,比如{ someOptionalField:null, someOptionalField2:null, ... } 我們團隊中的一些程序員認為這看起來很丑陋。 我有一個想法來擴展 Angular 的 ngModel 指令以隱式填充未定義模型值中的空值,因此它們總是被發送到服務器。 但我不確定這是否是正確的解決方案,因為我還沒有看到互聯網上的其他 Angular 程序員做過類似的事情。

以明確的方式解決這個問題並使服務器端程序員和我們的 Web API 用戶都清楚事情的正確方法是什么? 是否有任何已知的設計模式或最佳實踐?

我本人和我們的工作人員在后端處理此問題。 如果有一個可選字段,它必須有一個值(聽起來很有趣吧?),如果給定的輸入為空或根本不存在,它將被設置為其默認值。 像您說的那樣,僅忽略字段或將舊數據的值設置為 null 是不可取的,也不應該這樣做。

我喜歡在我的驗證函數的頂部創建默認值,如果它存在,只需用新的值覆蓋它。 如果有舊值,請使用它代替默認值:

1. Validation progress starts
2. If value is given - use it
2.1 If not given, look if there is an old value for this field and if so, use it
2.2 If still no value, use default

因此,您不會因為字段為空/未設置而收到錯誤,或者至少不必擔心。 而且您還可以正確處理默認值/舊值。

如果您序列化完整表單並將其發送到服務器,則可以補償 angular 不發送空字段的問題。 如果這不像在 jQuery (form.serialize()) 中那樣簡單或仍然有空字段,為什么不循環所有表單元素並手動創建 JSON/表單數據?

這個答案主要是基於意見的(就像問題本身一樣),但我希望它對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM