【发布时间】:2017-10-28 01:17:21
【问题描述】:
假设我是一名用户,我正在某个任意应用程序上编辑我的个人资料。该应用程序让我进行了一系列更改,完成后,我点击“保存”,我的个人资料就会更新。
在 GraphQL 中处理此类大型更新的推荐最佳做法是什么?在我看来,有几个选择:
A) 许多小的突变。如果用户更改了 5 项内容(即姓名、电子邮件、用户名、图像、简历),则客户端可以向服务器触发 5 次更改。
优点:更小、更孤立的操作。
缺点:这不是违背了 GraphQL 中“往返服务器”的目的,因为它需要... 5?
B) 许多小的突变,称为服务器端。与其从客户端调用 5 个变更(需要 5 次往返),不如将一个数据 blob 发布到服务器并拥有一个解析它的函数,并对它找到的数据运行单个变更。
优点:往返一次
缺点:我们必须在应用程序中添加另一个层来处理这个问题。随着时间的推移,新功能会变得混乱、难以测试且难以维护。
C) 一个大突变。用户通过单个突变将数据 blob 发送到服务器,这会将新数据批量设置在文档上,而不是在每个字段上运行单独的突变。
优点:DX;往返一次。
缺点:由于字段是作为参数传入的,这会使应用程序受到攻击。恶意用户可以尝试传入任意字段,设置不应更改的字段(即isAdmin 字段)等。突变必须聪明地知道允许更新哪些字段,并拒绝/忽略其余的。
我在网上找不到太多关于哪种方式是在 GraphQL 中做这种事情的“正确方式”。希望在这里找到一些答案/反馈。谢谢!
【问题讨论】:
-
往返服务器的真正目的是查询,而不是突变。
-
我认为你想多了。方法 1 和 3 都是解决此问题的正确方法,具体取决于您的需要。我会选择 3,这在大多数情况下可能是最稳健的方式。