4. 调用 Mutations

Mutations是修改 GraphQL 数据集的方法。MutationGraphQL 字段查询非常相似,但 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只返回了修改后的文档。在这个案例里,返回的是createIdentifiercardTypecardNocardName字段。

与查询不同,我们需要通过 Mutation 关键词明确指出这是一条Mutation。就像这样:

mutation {
  ...
}

如果你需要添加一个新身份标识/卡号卡类型,但不包含 cardType 参数,你会得到 Field \"createIdentifier\" argument \"cardType\" of type \"String!\" is required but not provided.的报错。

参数 Required

createIdentifier Mutation 中,cardTypecardNorequired 的参数。我们调用createIdentifier时必须包含它们。这就是报错的原因。

这在 mutation 中不是独一无二的,我们可以让任何参数都 required

你可以使用GraphQL沙盒Docs 部分来查看参数。 可以看出,cardTypecardNo 字段是 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

GraphQLMutation 是作为一个序列执行。如多次添加相同的身份证件例子,如果不顺序执行,则很难检测错误。

这完全取决于 GraphQL 服务端对 Mutation 的实现。参考并遵循 Node 以及社区其他如 PythonScala 的实现。

最后

现在我们已经学会了如何对 GraphQL 服务器调用 Mutation。它就像一次查询,但Mutation改变了GraphQL背后的数据集。

GraphQL沙盒 中,还有另一个叫做createPostmutation。可以尝试创建文章并查询他们。

results matching ""

    No results matching ""