概述
让我们进入代码!
在本课中,我们将
- 转换
Location
类型为 实体,可以在我们的 子图之间共享 - 发布对现有 子图的更新
✏️ 定义 Location
实体的 @key
打开
subgraph-locations/locations.graphql
文件,找到Location
类型。subgraph-locations/locations.graphqltype Location {id: ID!"The name of the location"name: String!"A short description about the location"description: String!"The location's main photo as a URL"photo: String!}我们将添加
@key
指令 到这个类型定义中,指定fields
属性并将其值设置为id
。subgraph-locations/locations.graphqltype Location @key(fields: "id") {id: ID!"The name of the location"name: String!"A short description about the location"description: String!"The location's main photo as a URL"photo: String!}
查看沙盒中的更改
让我们测试一下我们的更改。打开https://127.0.0.1:4001 在您的浏览器中,使用沙盒再次 查询 我们的服务器。
在 文档 选项卡中,我们现在应该看到 字段 在 Query 类型上称为 _entities
。这是一个特殊的 字段, 路由器 使用它来协调 子图 之间的数据。我们将在下一课中学习路由器如何准确地使用这个字段。
除此之外,变化不大!我们仍然可以使用 Explorer 查询 locations
子图,就像以前一样。(尝试运行一个关于 locations 字段 的快速 查询,确保一切正常工作。)
发布 locations
子图
我们需要发布这个 子图,以便架构注册表可以获取我们的更改。
让我们确保我们在运行终端中的 rover subgraph publish
命令时位于项目的顶层目录中。
rover subgraph publish <APOLLO_GRAPH_REF> \--name locations \--schema ./subgraph-locations/locations.graphql
我们可以省略 --routing-url
选项,因为我们第一次发布 子图 到注册表时已经设置了该值。
太好了,看起来我们的更改已经成功发布了!
✏️ 在 reviews
中定义我们的实体
我们想在我们的 reviews
子图 中使用 Location
实体。
打开
subgraph-reviews/reviews.graphql
文件。我们将添加
Location
类型定义,以及@key
指令,并将id
字段 设置为主键。subgraph-reviews/reviews.graphqltype Location @key(fields: "id") {# to fill in}在大括号内,我们将添加
id
字段,类型为非空ID!
。subgraph-reviews/reviews.graphqltype Location @key(fields: "id") {id: ID!}该
Location
实体 不需要包含 所有 我们为它在 子图 中定义的 字段。毕竟,reviews
子图 不知道任何关于这些 字段 的信息,也不知道如何解析它们!到目前为止,我们已经为我们的
reviews
子图 提供了一个 存根 的Location
实体。存根充当类型的基本表示,其中包含在 子图 中使用该类型所需的足够信息。我们还需要进行一个更改。因为
reviews
子图 不 负责 解析任何 实体 的其他 字段,我们将为@key
指令 添加一个属性。在
@key
指令 中,添加一个名为resolvable
的属性,并将其设置为false
。subgraph-reviews/reviews.graphqltype Location @key(fields: "id", resolvable: false) {id: ID!}这个属性告诉 路由器 这个 子图 没有定义这个 实体 的参考 解析器。
回想一下,一个引用 解析器 负责返回所有 实体 字段,该 子图 贡献。该
reviews
子图 不会贡献任何其他 字段(除了键字段),因此不需要定义引用 解析器。该resolvable: false
属性向 路由器 指示这一点!
发布 reviews
子图
现在让我们发布我们的 reviews
子图 更新。从项目根目录中的终端,让我们再次运行 rover subgraph publish
命令。
rover subgraph publish <APOLLO_GRAPH_REF> \--name reviews \--schema ./subgraph-reviews/reviews.graphql
好的,我们看到一条成功消息,我们的更改已成功添加到注册表中!
练习
将下面的 Book 类型转换为实体。一本书可以通过其 国际标准书号 (ISBN) 进行唯一标识。
关键要点
- 要创建 实体,我们可以使用
@key
指令 指定哪些 字段 可以唯一标识该类型的对象。 - 当一个 子图 不能用于解析任何非
@key
字段 的 实体 时,我们将resolvable: false
传递给@key
指令 定义。
下一步
我们已经将实体添加到我们的 子图模式 并发布了我们的更改!
在下一课中,我们将学习 路由器 如何使用实体和 实体 表示来连接来自多个 子图 的数据。
分享您关于本课的问题和评论
您的反馈意见有助于我们改进!如果您卡住或感到困惑,请告诉我们,我们会帮助您。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或处理的评论可能会被删除。
您需要一个 GitHub 帐户才能在下面发布。还没有? 请在我们的 Odyssey 论坛中发布。