【问题标题】:GraphQL: Why shouldn't we use `query` to write dataGraphQL:为什么我们不应该使用`query`来写数据
【发布时间】:2019-10-07 01:17:36
【问题描述】:

我知道在 GraphQL 中:Query 用于您想从服务器读取一些数据,而Mutation 用于您想将数据写回服务器。

但是我不能去查询中的解析器做一个写操作吗?

我不知道为什么我们需要将读取和写入操作分开,因此需要突变。

【问题讨论】:

标签: graphql


【解决方案1】:

来自spec

GraphQL 可建模三种类型的操作:

  • 查询 - 只读获取。
  • mutation – 一个写入,然后一个提取。
  • 订阅 – 一个长期存在的请求,用于获取数据以响应源事件。

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

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

所以在像

这样的查询中
query {
  foo
  bar
}

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

mutation {
  foo
  bar
}

foo 将首先解析,然后是 bar

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

在实际的方面,请务必记住,客户通常也会根据特定操作的操作类型对应用行为做出某些假设。例如,react-apollo 假设应该在组件挂载时运行查询,同时假设突变是由用户操作触发的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 2011-05-16
    • 2018-01-15
    • 2018-06-02
    • 2015-12-09
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多