2017-05-27 83 views
0

比方说,我是一个用户,我正在编辑我的个人资料在一些任意的应用程序。该应用程序让我做了一堆更改,当我完成后,我点击“保存”,我的个人资料得到更新。GraphQL:许多小的突变,或者一个体突变?

在GraphQL中推荐的最佳实践是如何处理这样的大型更新?在我看来,有几个选项:

A)许多小的突变。如果用户改变了5件事情(即姓名,电子邮件,用户名,图片,生物),客户端可以向服务器发起5次突变。

优点:更小,更孤立的操作。

缺点:这不会破坏GraphQL中“往返服务器的一次往返”的目的,因为它需要...... 5?

b)许多小的突变,称为服务器端。与其从客户端调用5个突变,需要5次往返,您可以将数据blob发布到服务器,并具有解析它的功能,并对其找到的数据运行单个突变。

优点:一个往返

缺点:我们有另一个层添加到应用程序来处理这个问题。新功能会变得混乱,难以测试,并且随着时间的推移很难保持。

C)一个大突变。用户通过单个突变将数据blob发送到服务器,该突变在文档上批量设置新数据,而不是在每个字段上运行单个突变。

优点:DX;一次往返。

缺点:由于字段被作为参数传入,因此会打开应用程序进行攻击。恶意用户可以尝试传递任意字段,设置不应该被改变的字段(即isAdmin字段)等等。突变必须是聪明的,以知道允许哪些字段被更新,并且拒绝/忽略其余字段。


我在网上找不到很多关于在GraphQL中做这种事情的“正确方法”。希望在这里找到一些答案/反馈。谢谢!

+0

往返服务器的一次往返查询,并非突变。 – blockhead

+0

我认为你正在超越它。方式1和方式3都是正确的方法来解决这个问题取决于你需要什么。我会选择3,它可能是大多数情况下最稳健的方式。 – whitep4nther

回答

0

我会用第三种解决方案,一大突变。我不确定我是否理解你关于恶意用户传递任意字段的观点:他们无法传递未在模式中定义的字段。

至于服务器端的逻辑,你必须把这些智能检查:无论如何你永远不能相信客户!

+0

谢谢!我绝对是在推翻它的安全性。我没有意识到你不能将任意值传递给一个变种来试图欺骗它,你只能提供在你的模式中指定的确切字段,并且它们必须是预期的类型。因此,这意味着您从单个突变中获得的工作越多越好。更大,更通用的突变! –