Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GraphQL:许多小突变,还是一个大突变?_Graphql_Relay_Apollo - Fatal编程技术网

GraphQL:许多小突变,还是一个大突变?

GraphQL:许多小突变,还是一个大突变?,graphql,relay,apollo,Graphql,Relay,Apollo,假设我是一名用户,正在某个任意应用程序上编辑我的个人资料。这个应用让我做了一系列的更改,当我完成后,我点击“保存”,我的个人资料就会更新 在GraphQL中,处理这样的大型更新的推荐最佳实践是什么?在我看来,有几个选择: A) 许多小突变。如果用户更改了5项内容(即姓名、电子邮件、用户名、图像、个人信息),客户端可能会向服务器发送5项更改 优点:更小、更隔离的操作 缺点:这不是违背了GraphQL中“到服务器的一次往返”的目的吗,因为它需要。。。五个 B) 许多小突变,称为服务器端。与从客户端调

假设我是一名用户,正在某个任意应用程序上编辑我的个人资料。这个应用让我做了一系列的更改,当我完成后,我点击“保存”,我的个人资料就会更新

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

A) 许多小突变。如果用户更改了5项内容(即姓名、电子邮件、用户名、图像、个人信息),客户端可能会向服务器发送5项更改

优点:更小、更隔离的操作

缺点:这不是违背了GraphQL中“到服务器的一次往返”的目的吗,因为它需要。。。五个

B) 许多小突变,称为服务器端。与从客户端调用5个突变(需要5个往返)不同,您可以将一个数据blob发布到服务器,并使用一个函数对其进行解析,然后对找到的数据运行单个突变

优点:往返一次

缺点:我们必须在应用程序中添加另一层来处理这个问题。随着时间的推移,新功能将变得混乱、难以测试和维护

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

优点:DX;一次往返

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



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

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

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

A) 许多小突变。如果用户更改了5项内容(即姓名、电子邮件、用户名、图像、个人信息),客户端可能会向服务器发送5项更改

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

下面是一个例子:

mutation {
  setUserName(name: "new_name") { ok }
  setUserEmail(email: "new_email") { ok }
}
B) 许多称为服务器端的小突变。与从客户端调用5个突变(需要5个往返)不同,您可以将一个数据blob发布到服务器,并使用一个函数对其进行解析,然后对找到的数据运行单个突变

这正是GraphQL在您改变多个字段或同时执行多个查询时为您所做的

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

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

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


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

往返服务器实际上是为了查询,而不是突变。我认为您想得太多了。根据您的需要,方法1和3都是解决此问题的正确方法。我会选择3,在大多数情况下,这可能是最稳健的方式。谢谢!我肯定是想得太多了。我还没有意识到,不能将任意值传递给变异来尝试欺骗它,只能提供模式中指定的确切字段,它们必须是预期的类型。因此,这意味着你能从单个突变中获得的工作越多越好。因此,更大,更通用的突变!