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