10. 定义实体
3m

概述

让我们进入代码!

在本课中,我们将

  • 转换Location 类型为 ,可以在我们的 之间共享
  • 发布对现有 的更新

✏️ 定义 Location 实体的 @key

  1. 打开 subgraph-locations/locations.graphql 文件,找到 Location 类型。

    subgraph-locations/locations.graphql
    type 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!
    }
  2. 我们将添加 @key 到这个类型定义中,指定 fields 属性并将其值设置为 id

    subgraph-locations/locations.graphql
    type 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 在您的浏览器中,使用沙盒再次 我们的服务器。

文档 选项卡中,我们现在应该看到 类型上称为 _entities。这是一个特殊的 使用它来协调 之间的数据。我们将在下一课中学习路由器如何准确地使用这个字段。

studio.apollographql.com/sandbox/explorer
The Location subgraph displaying an _entities field

除此之外,变化不大!我们仍然可以使用 Explorer locations ,就像以前一样。(尝试运行一个关于 的快速 ,确保一切正常工作。)

发布 locations 子图

我们需要发布这个 ,以便架构注册表可以获取我们的更改。

让我们确保我们在运行终端中的 rover subgraph publish 命令时位于项目的顶层目录中。

rover subgraph publish <APOLLO_GRAPH_REF> \
--name locations \
--schema ./subgraph-locations/locations.graphql

我们可以省略 --routing-url 选项,因为我们第一次发布 到注册表时已经设置了该值。

太好了,看起来我们的更改已经成功发布了!

✏️reviews 中定义我们的实体

我们想在我们的 reviews 中使用 Location

  1. 打开 subgraph-reviews/reviews.graphql 文件。

  2. 我们将添加 Location 类型定义,以及 @key ,并将 id 设置为主键。

    subgraph-reviews/reviews.graphql
    type Location @key(fields: "id") {
    # to fill in
    }
  3. 在大括号内,我们将添加 id ,类型为非空 ID!

    subgraph-reviews/reviews.graphql
    type Location @key(fields: "id") {
    id: ID!
    }

    Location 不需要包含 所有 我们为它在 中定义的 。毕竟, reviews 不知道任何关于这些 的信息,也不知道如何解析它们!

    到目前为止,我们已经为我们的 reviews 提供了一个 存根Location 。存根充当类型的基本表示,其中包含在 中使用该类型所需的足够信息。

    我们还需要进行一个更改。因为 reviews 负责 解析任何 的其他 ,我们将为 @key 添加一个属性。

  4. @key 中,添加一个名为 resolvable 的属性,并将其设置为 false

    subgraph-reviews/reviews.graphql
    type 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 论坛中发布。