繁体   English   中英

GraphQL:许多小突变,或一个批量突变?

[英]GraphQL: Many small mutations, or one bulk mutation?

假设我是一名用户,我在一些任意应用上编辑我的个人资料。 该应用程序让我做了一些更改,当我完成后,我点击“保存”,我的个人资料得到更新。

GraphQL建议的最佳做法是什么来处理这样的大型更新? 在我看来,有几个选择:

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

优点:更小,更孤立的运营。

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

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

优点:一次往返

缺点:我们必须在应用程序中添加另一个图层来处理这个问题。 新功能会变得混乱,难以测试,并且难以维持。

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

优点:DX; 一次往返。

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


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

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

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

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

您可以在单个请求中执行多个突变。 无需多次调用服务器。

这是一个例子:

mutation {
  setUserName(name: "new_name") { ok }
  setUserEmail(email: "new_email") { ok }
}

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

当您改变多个字段或一次执行多个查询时,这正是GraphQL为您所做的。

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

即使您使用多个字段,仍可以批量设置数据。
这将要求您不必直接更新数据库,而是将请求传递给中间件,该中间件将在执行所有突变解析器后构建并执行单个查询。

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

您不应该使用任意变量,而是将所有允许的属性列为参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM