【发布时间】:2019-10-07 01:17:36
【问题描述】:
我知道在 GraphQL 中:Query 用于您想从服务器读取一些数据,而Mutation 用于您想将数据写回服务器。
但是我不能去查询中的解析器做一个写操作吗?
我不知道为什么我们需要将读取和写入操作分开,因此需要突变。
【问题讨论】:
标签: graphql
我知道在 GraphQL 中:Query 用于您想从服务器读取一些数据,而Mutation 用于您想将数据写回服务器。
但是我不能去查询中的解析器做一个写操作吗?
我不知道为什么我们需要将读取和写入操作分开,因此需要突变。
【问题讨论】:
标签: graphql
来自spec:
GraphQL 可建模三种类型的操作:
- 查询 - 只读获取。
- mutation – 一个写入,然后一个提取。
- 订阅 – 一个长期存在的请求,用于获取数据以响应源事件。
因为由每个 GraphQL 服务来提供实际的字段解析逻辑,显然可以创建具有副作用和突变的查询,而这些查询实际上只是只读操作。查询和突变之间的区别主要基于约定和客户期望——查询旨在成为类似于GET requests are "safe" 的“安全”操作。
这两个操作的执行方式有一个主要区别——查询的选择集可以并行解决,而突变的选择集总是串行解决。
所以在像
这样的查询中query {
foo
bar
}
foo 和 bar 将同时解析。另一方面,这里
mutation {
foo
bar
}
foo 将首先解析,然后是 bar。
这是一项重要的功能,因为它允许客户端发送多个相互依赖的突变(例如,插入后跟更新)。通常,字段的并行执行是一件好事,因为它可以缩短响应时间,但在这里顺序执行可能是一个理想的特性。
在实际的方面,请务必记住,客户通常也会根据特定操作的操作类型对应用行为做出某些假设。例如,react-apollo 假设应该在组件挂载时运行查询,同时假设突变是由用户操作触发的。
【讨论】: