gpt4 book ai didi

javascript - 更新记录时缺少可选字段值的正确明确的服务器端行为应该是什么?

转载 作者:行者123 更新时间:2023-11-29 23:27:11 25 4
gpt4 key购买 nike

我们有一个 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/表单数据?

这个答案主要是基于意见(正如问题本身一样),但我希望它对您有所帮助!

关于javascript - 更新记录时缺少可选字段值的正确明确的服务器端行为应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48701197/

25 4 0
文章推荐: Android:id 在 DrawerLayout 内容 View 中抛出错误
文章推荐: mysql - 修复 MacPorts MySQL 的配置问题
文章推荐: java - 如何修复右按钮边框未在应用程序中显示?
文章推荐: javascript - 只打印
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com