9. 引入突变
3m

概述

到目前为止,我们仅处理从 API 中获取数据。现在是时候进行转换,修改我们的数据了。

我们应用程序中的每个音轨都显示了查看次数。当用户通过主页访问曲目页面时,我们希望每次都增加此数字。我们将使用 !

https://127.0.0.1:3000/track/c_0

The track page, highlighting the track's number of views we wish to increment

在本课程中,我们将

  • 了解是什么
  • 在 Explorer 中测试

Mutation 类型的

到目前为止,我们的应用只使用了一种 :查询。这些都是用于检索数据的只读操作。要修改数据,我们需要使用另一种类型的 GraphQL 操作: 变异,即 写操作

Query 类型非常类似, Mutation 类型用作我们的模式的入口点。它遵循与 (我们到目前为止一直在使用的)相同的语法。

模式语法

的模式中, Mutation 类型使用 type 关键字,然后是 Mutation 名称来声明。大括号内是入口点: ,我们可以用它们来更改我们的数据。

Illustration showing the schema syntax for adding a mutation

通常以一个描述我们更新 (例如 adddeletecreate)的具体操作的动词开头,后跟 作用的任何数据。由于变异通常会修改特定对象,因此它们通常需要 。变异的返回类型显示在冒号之后。

响应应包括变异更新的数据,以便我们的客户端可以在不必运行后续 来获取这些详细信息的情况下更新其 UI!

我们可以通过返回沙箱的架构页面,并从左侧菜单中选择Mutation来更仔细地查看 API 的Mutation类型。

http://studio.apollographql.com/sandbox/schema/reference

The Schema Reference page in Sandbox opened to the Mutation type

我们可以看到,要增加特定曲目上的观看数,此以该曲目的id作为。它返回一种类型,称为IncrementTrackViewsResponse。我们点击该类型,仔细查看一下。

http://studio.apollographql.com/sandbox/schema/reference

The Schema Reference page in Sandbox, opened to the IncrementTrackViewsReponse type

此类型上的向我们展示了时我们将能够访问的数据完成。我们可以看到codesuccessmessage,它们是产生的结果,我们还可以访问整个Track对象,该对象在track 下已修改。

处理变更

要开始使用此,让我们返回Mutation页面,向下滚动到incrementTrackViews 。要在 Explorer 中打开此,让我们点击字段描述中右侧的播放图标。

https://studio.apollographql.com/sandbox/schema/reference

Screenshot of the Mutation field, incrementTrackViews, with the play button highlighted

这将带我们进入 Explorer 页面,其中侧边栏已打开,让我们准备好开始构建我们的第一个

https://studio.apollographql.com/sandbox/explorer

Screenshot of Explorer with an empty Operation panel, ready for us to start building our query

单击 旁边的加号按钮 (incrementTrackViews) 将其添加到我们的 操作面板中。这会为我们预先填写一些信息!

mutation IncrementTrackViews($incrementTrackViewsId: ID!) {
incrementTrackViews(id: $incrementTrackViewsId) {
}
}

✍️生成 GraphQL 突变

我们从 mutation关键字开始,然后再写 的名称 (Explorer 已将其命名为 IncrementTrackViews给我们)。在括号内,我们有一个 ,用 $符号表示,名为 incrementTrackViewsId,类型为 ID,并且是必需的。

在下面的 变量部分中设置。现在它被设为 null,因此我们将其更改为我们一直使用的相同曲目 ID: c_0

{
"incrementTrackViewsId": "c_0"
}
https://studio.apollographql.com/sandbox/explorer

Screenshot of Explorer with the mutation operated added, and a track Id variable filled in

返回到 ,到 操作面板中!

在花括号内,我们列出 的入口点: incrementTrackViews。它接收一个 id ,我们将该参数设为 incrementTrackViewsId,这个变量与我们刚刚设为 c_0相同。

现在在第二对大括号内部,我们可以开始添加在我们的响应对象中可用。这些字段位于侧边栏中,通过单击旁边的加号按钮()按钮,可以非常轻松地构建此

我们希望看到codesuccess布尔值、messagetrack对象本身。

track对象内部,我们希望idnumberOfViews。浏览次数是我们正在更新的内容,因此希望在成功后看到新更新的值。我们的缓存将使用id,我们将在稍后介绍前端实现时对其进行介绍。

https://studio.apollographql.com/sandbox/explorer

The complete mutation operation built out in the Explorer

应如下所示:

mutation IncrementTrackViews($incrementTrackViewsId: ID!) {
incrementTrackViews(id: $incrementTrackViewsId) {
code
success
message
track {
id
numberOfViews
}
}
}

让我们继续运行它!

在右侧,您可以看到我们预期的code为 200,success标志为truemessage表示成功,并且我们获得了新更新后的track

https://studio.apollographql.com/sandbox/explorer

Screenshot of the Explorer showing a successful response to the IncrementTrackViews mutation

当我们一次又一次地运行时,我们可以看到浏览次数正在上升!

让我们看看当我们把 incrementTrackViewsId 更改为我们的无聊字符串“DOESNTEXIST”时会发生什么。

{
"incrementTrackViewsId": "DOESNTEXIST"
}

当我们运行此 时,我们看到响应中有 code 404,successfalse,而 message 显示 Could not find track with specified IDtrack 也被设置为 null,没有任何可用数据。

https://studio.apollographql.com/sandbox/explorer

Screenshot of the Explorer showing a 404 response to the IncrementTrackViews mutation

我们的 看起来很棒,并且它正在做它应该做的事情!是时候将此功能引入我们的应用程序中了。

实践

Mutations 与 Queries
Queries 和 Mutations 都是 GraphQL 的类型
 
. Queries 是 
 
始终 
 
 数据。Mutations 是
 
 始终 
 
数据。类似于 Query 字段, 
 
 类型的字段也 
 
 到 GraphQL API 中。

将此框中的项目拖到上面空白处

  • 修改

  • 检索

  • 写入

  • 端点

  • 删除

  • 读取

  • 创建

  • 入口点

  • Mutation

  • 分配

  • 操作

在编写 GraphQL mutation 时,应该以哪个关键字开头?

要点

  • 是写入-,允许我们更改数据。
  • 就像 Query 类型一样,Mutation 类型充当我们模式的入口点。

下一步

我们的 已经构建并按我们预期运行。现在进入最后一步:将它引入我们的客户端代码,并看到我们的更改反映在 UI 中!

上一步

分享您对本课程的问题和评论

本课程当前为

Beta 版
.您的反馈有助于我们改进!如果您陷入困境或困惑,请告知我们,我们会帮您解决。所有评论都是公开的,并且必须遵循 Apollo 行为准则。请注意,已解决或处理的评论可能会被删除。

您需要一个 GitHub 帐户才能在下面发帖。没有帐户? 转而发布到我们的 Odyssey 论坛。