GraphQL:为什么我们不应该使用“查询”来写数据

时间:2019-05-20 16:27:13

标签: graphql

我知道在GraphQL中:当您想从服务器读取某些数据时使用Query,而当您想将数据写回到服务器时使用Mutation

但是我不能转到查询中的解析器并执行写操作。

我不知道为什么我们需要分开读写操作,因此需要进行变异。

1 个答案:

答案 0 :(得分:3)

来自spec

  

GraphQL可以进行三种类型的操作:

     
      
  • 查询–只读获取。
  •   
  • 变异–先写后抓取。
  •   
  • 订阅–响应源事件而获取数据的长期请求。
  •   

由于要由每个GraphQL服务提供实际的字段解析逻辑,因此显然有可能创建带有副作用和变异的查询,而这些查询和变异实际上只是只读操作。查询和突变之间的区别主要是基于约定和客户期望的区别-查询旨在成为类似于GET requests are "safe"的“安全”操作。

这两个操作的执行方式有一个主要区别-查询的选择集可以并行解决,而突变的选择集则总是串行解决。

因此在

之类的查询中
query {
  foo
  bar
}

foobar将同时解析。另一方面,这里

mutation {
  foo
  bar
}

foo首先解析,然后是bar

这是一项重要功能,因为它允许客户端发送相互依赖的多个突变(例如,插入后跟更新)。通常,并行执行字段是一件好事,因为它可以缩短响应时间,但在这里顺序执行可能是理想的功能。

从实用的角度来说,请务必记住,客户端也经常根据特定操作的操作类型对应用程序行为做出某些假设。例如,react-apollo假设在安装组件时应运行查询,而假设突变是由用户操作触发的。