5. 添加子图
10m

概述

让我们将我们的房源数据与过去客人的评论结合起来。使用,这非常简单:我们只需点击几下即可!

在本课中,我们将

  • 添加一个新的 到我们的 中,使用 Studio
  • 检查一个

介绍评论

我们即将了解评论 API;它是另一个功能齐全的 ,具有架构、 和数据提取器。

reviews 服务收集并提供来自客人的反馈。我们可以 它以获取其数据库中的所有评论,或提交新的评论。

让我们欢迎这个 和全新的功能进入我们的 API——我们可以通过克隆存储库并立即报告其架构来实现。无需任何调整!

克隆 reviews

在你的终端中,导航出 listings 目录,以便你位于主 odyssey-federation-typescript 项目文件夹中。然后,运行以下命令克隆 reviews

odyssey-federation-typescript
git clone https://github.com/apollographql-education/odyssey-federation-ts-reviews.git reviews

注意: 我们在上面的命令中附加了一个额外的 reviews 标志。这将以名为 reviews 的文件夹克隆提供的存储库,以确保清晰度。

现在我们的项目结构如下

📦 odyssey-federation-typescript
┣ 📂 listings
┣ 📂 reviews
┗ 📂 router

让我们打开 reviews。我们将运行以下命令。

首先,安装我们的依赖项

npm install

接下来,启动服务器

npm run dev

添加子图

让我们将我们的 reviews 架构发布到注册表。

复制下面的命令,将 你的 值替换为 APOLLO_GRAPH_REF。然后,在打开到 reviews 目录的终端中,粘贴并运行它。

reviews
rover subgraph publish <APOLLO_GRAPH_REF> \
--name reviews \
--schema ./src/schema.graphql \
--routing-url https://127.0.0.1:4001

注意:listings 在本地端口 4000 上运行,而 reviews 4001 上运行。请确保当你发布 reviews 架构时,引用了正确的端口号!

现在让我们返回 Studio,并导航到左侧菜单中的 子图 选项卡。我们会看到我们的新 reviews 已被报告——而且我们的 已扩展!

studio.apollographql.com

A screenshot of the Subgraphs page, showing two subgraphs: listings and reviews

我们的新超级图架构

接下来,让我们通过导航菜单查看 变更日志,看看 reviews 为 API 添加了哪些新功能和功能。

studio.apollographql.com

The Changelog page in Studio, showing additions to the schema from the reviews subgraph

我们可以看到我们的 已扩展——包含所有关于评论的类型和 !我们有两个新的 ReviewSubmitReviewResponse。我们还有 ReviewInput 作为新的输入类型。并且我们有两个新的根 Query.allReviewsMutation.submitReview

所有这些新类型和 都可能来自 reviews 。我们可以通过转到 架构 页面来确认哪些 来自哪个子图。

参考 选项卡下,选择 查询,我们可以看到我们 的入口点。 子图 列表示每个 来自哪个

studio.apollographql.com

The Schema page in Studio, showing fields on the Query type and which subgraph provides them

在这里我们会看到新的 reviews 贡献的:allReviews

我们还可以查看在 对象 下添加到我们架构中的新

studio.apollographql.com

The Schema page in Studio, showing the object types and which subgraph provides them

我们的 已正式扩展!

发送查询

评论和房源的数据都在我们的指尖;你是否迫不及待地想要测试我们 的强大功能?让我们尝试发送一个涉及两个

让我们回到 查询 选项卡,位于 架构 页面中,我们可以看到我们 的所有可用入口点。在 架构 页面中的 操作 列中,点击 allReviews 旁边的播放图标

studio.apollographql.com

The play button beside the allReviews field outlined

这将在 Explorer 中打开文档选项卡,显示该 以及我们可以用来构建 的内容。

studio.apollographql.com

The Explorer with the Documentation tab opened to the listing field

注意: 如果你在 操作 面板中当前有一个 ,请清除它或打开一个新的 Explorer 选项卡。我们想从这里开始!

allReviews 下,我们可以看到它的描述——"数据库中所有评论的列表"——以及每个返回的 Review 类型上可用于 。让我们添加它们:idtextrating

query GetAllReviews {
allReviews {
id
text
rating
}
}

这些数据来自 reviews !现在让我们从 listings 中提取数据:为什么不提取特定房源的数据呢?

在 Explorer 中有一个方便的快捷方式来搜索我们的模式以查找该 。按下 Command + KCtrl + K 访问聚光灯搜索。开始输入 listing,该 Query.listing 应该会弹出。

studio.apollographql.com

The Explorer with the search modal pulled up, and Query.listing selected from the dropdown

让我们添加 listing 并请求其 title

最后,我们将重命名该 使其更明确。将其命名为 GetAllReviewsAndListing

您的 现在应该看起来像这样:

query GetAllReviewsAndListing($listingId: ID!) {
allReviews {
id
text
rating
}
listing(id: $listingId) {
title
}
}

变量 部分:

{
"listingId": "listing-1"
}

让我们运行它!

哇哦,我们拿到了数据!一个查询,但数据来自两个独立的子图 🤯🎉

查询计划

我们可以通过检查 查询计划 来验证每个 的数据来自哪里。该 就像一个 的蓝图:该 使用的一组指令,用于将较小的操作发送到负责这些特定

单击 响应 面板中的下拉菜单,然后选择 查询计划

studio.apollographql.com

The Response panel opened to the Query Plan, which shows how the router will execute the query to the subgraphs

我们可以将 视为图表,或者如果我们选择 “将计划显示为文本” 图标,则可以将其视为文本。我们不必过多关注 语法 - 该 知道发生了什么!但当我们开始涉及更多 以及需要优化的更复杂的查询时,这将非常有用。

studio.apollographql.com

Query plan preview in text format, showing which subgraph each field is fetched from

对于这个特定的 ,我们可以看到“并行”一词,表明该 可以同时发出两个独立的请求:一个到 reviews,另一个到 listings。这些请求可以并行运行,因为 listingsreviews 都不需要依赖对方来解析自己的数据。

我们还可以看到 allReviews 及其子字段来自 reviews (即 Fetch(service: "reviews") 部分),而 listing 及其子字段来自 listings 。这两个较小的 并行运行,并由它们自己的子图解析,该 负责将数据捆绑在一起,以单个响应形式返回给客户端。

添加一个 很简单!但您可能觉得两个子图中的数据仍然是分离的和孤立的。没有任何东西直接 连接 房源和评论或反之。

新功能:房源的评分和评论

我们希望能够针对特定房源进行 ,以获取有关该房源的详细信息:其标题、描述、床位数和便利设施,以及为其撰写的评论!让我们更进一步 - 让我们还包括房源的 overallRating,该评分由所有评分汇总计算得出。

A preview of what our listing data should look like, supplemented with reviews and overall rating

这是梦想 的样子:

query GetListingAndReviews {
listing(id: "listing-1") {
title
description
numOfBeds
amenities {
name
category
}
overallRating
reviews {
id
text
}
}
}

注意:我们在此将房源的 id 内联在一起,以便在我们学习过程中方便引用。实际上,该 id 将被提取到一个 中。

让我们深入到我们的 reviews 数据中,看看如何将此功能整合在一起,并实现我们的梦想

数据位于 reviews

当我们启动 reviews 服务器时,它会自动在其内存数据库中播种一些示例评论。

评论表定义了四列: idtextratinglistingId。以下是将这些数据汇总在一起的表格。

idtextratinglistingId
1"哇,真是太棒了!我以前从未住过洞穴,所以准备不足。幸运的是,这个房源拥有我需要的各种设施,让我感到安全和准备充足,可以应对任何情况。"4"listing-1"
2"我 100% 享受了荒野体验。如果您不是探险家和户外爱好者,请勿预订。"5"listing-2"
3"一般般,说实话可以更好。我期待更多。湖泊是唯一好的地方。"2"listing-3"

listingId 正是我们需要关联特定评论与其所针对房源的字段。

只有一个问题:除了数据库中的这列之外,我们的 reviews 根本不知道 什么 是“房源”。同样,我们的 listings 也不了解 reviews!即使它们是同一 的一部分,每个 都生活在自己的世界中。

我们需要一种方法来连接两个 之间的数据,以使我们的梦想 能够正常工作(提示:这叫做实体!)。这将涉及对我们的两个子图进行一些更改,因此我们将首先设置正确的 开发环境。这将确保我们对一个子图所做的任何更改不仅按预期工作,而且还能与另一个子图良好配合。

练习

要添加一个新的子图,GraphOS 需要知道哪些值?

关键要点

  • 要添加一个新的 ,我们可以使用 Studio UI 或
  • 我们可以查看 使用 Explorer。

接下来

让我们在下一课中为本地开发做好准备。

上一页

分享您对此课程的疑问和评论

本课程目前处于

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

您需要一个 GitHub 帐户才能在下面发帖。还没有吗? 改在 Odyssey 论坛发帖。