4. 调用 Mutations
Mutations是修改 GraphQL 数据集的方法。Mutation 和 GraphQL 字段查询非常相似,但 GraphQL 赋予了 Mutation 改变数据集的 Schema 的能力,因此它有副作用。
我们已经了解到,GraphQL处理多字段查询时,只用了很短的响应时间。但在一个请求中有多条 Mutation 时,这些 Mutation 会被一条条执行。(我们会去了解为什么)。
所以,让我们开始改变我们的博客数据集。
第一个Mutation
好吧,让我们给博客添加一个新的 author 字段。为此,我们在 GraphQL沙盒 中调用一下Mutation。
mutation {
createAuthor(
_id: "john",
name: "John Carter",
){
_id,
name,
}
}
// 你调用它会得到这样的结果:
{
"data": {
"createAuthor": {
"_id": "john",
"name": "John Carter"
}
}
}
我们调用一个带有参数的createAuthor Mutation。然后这个Mutation只返回了修改后的文档。在这个案例里,返回的是createAuthor的_id和name字段。
与查询不同,我们需要通过 Mutation 关键词明确指出这是一条Mutation。就像这样:
mutation {
...
}
如果你需要添加一个新作者,但不包含 name 参数,你会得到 Field \"createAuthor\" argument \"name\" of type \"String!\" is required but not provided.的报错。
参数 Required
在 createAuthor Mutation 中,_id 和 name 是 required 的参数。我们调用createAuthor时必须包含它们。这就是报错的原因。
这在
mutation中不是独一无二的,我们可以让任何参数都required。
你可以使用GraphQL沙盒的 Docs 部分来查看参数。
可以看出,name 字段是 String! 类型的,所以最后的 ! 表明这是一个 required 的字段。
多 Mutations
正如字段查询,我们也可以一次调用多个mutation,并将结果赋值给不同的变量。
举个例子,下面创建两个author:
mutation {
sam: createAuthor(
_id: "sam"
name: "Sam Hautom"
twitterHandle: "@sam"
){
_id
name
},
chris: createAuthor(
_id: "chris",
name: "Chris Mather"
twitterHandle: "@chris"
) {
_id
name
}
}
// 正如预期,我们得到了这样的结果:
{
"data": {
"sam": {
"_id": "sam",
"name": "Sam Hautom"
},
"chris": {
"_id": "chris",
"name": "Chris Mather"
}
}
}
// 现在尝试添加相同的author两次:
mutation {
carter: createAuthor(
_id: "carter",
name: "Carter Boom"
twitterHandle: "@carter"
) {
_id
},
carter2: createAuthor(
_id: "carter",
name: "Carter Boom"
twitterHandle: "@carter"
) {
_id
}
}
你会得到这样的结果:First mutation succeeded. But in the second one we got an error saying: "Author already exists: carter".
顺序执行mutation
在GraphQL,Mutation 是作为一个序列执行。如多次添加相同的作者例子,如果不顺序执行,则很难检测错误。
这完全取决于
GraphQL服务端对Mutation的实现。参考并遵循Node以及社区其他如Python和Scala的实现。
最后
现在我们已经学会了如何对 GraphQL 服务器调用 Mutation。它就像一次查询,但Mutation改变了GraphQL背后的数据集。
在 GraphQL沙盒 中,还有另一个叫做createPost的mutation。可以尝试创建文章并查询他们。