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。可以尝试创建文章并查询他们。

results matching ""

    No results matching ""