比方说,我是一个用户,我正在编辑我的个人资料在一些任意的应用程序。该应用程序让我做了一堆更改,当我完成后,我点击“保存”,我的个人资料得到更新。GraphQL:许多小的突变,或者一个体突变?
在GraphQL中推荐的最佳实践是如何处理这样的大型更新?在我看来,有几个选项:
A)许多小的突变。如果用户改变了5件事情(即姓名,电子邮件,用户名,图片,生物),客户端可以向服务器发起5次突变。
优点:更小,更孤立的操作。
缺点:这不会破坏GraphQL中“往返服务器的一次往返”的目的,因为它需要...... 5?
b)许多小的突变,称为服务器端。与其从客户端调用5个突变,需要5次往返,您可以将数据blob发布到服务器,并具有解析它的功能,并对其找到的数据运行单个突变。
优点:一个往返
缺点:我们有另一个层添加到应用程序来处理这个问题。新功能会变得混乱,难以测试,并且随着时间的推移很难保持。
C)一个大突变。用户通过单个突变将数据blob发送到服务器,该突变在文档上批量设置新数据,而不是在每个字段上运行单个突变。
优点:DX;一次往返。
缺点:由于字段被作为参数传入,因此会打开应用程序进行攻击。恶意用户可以尝试传递任意字段,设置不应该被改变的字段(即isAdmin
字段)等等。突变必须是聪明的,以知道允许哪些字段被更新,并且拒绝/忽略其余字段。
我在网上找不到很多关于在GraphQL中做这种事情的“正确方法”。希望在这里找到一些答案/反馈。谢谢!
往返服务器的一次往返查询,并非突变。 – blockhead
我认为你正在超越它。方式1和方式3都是正确的方法来解决这个问题取决于你需要什么。我会选择3,它可能是大多数情况下最稳健的方式。 – whitep4nther