10. 添加 Amenity 类型
10m

概述

我们快要完成列表详细信息页面所需的数据了。让我们继续添加便利设施!

在本课中,我们将

  • 介绍Amenity 类型到我们的模式中
  • 构建查询以显示列表及其所有便利设施的数据

构建 Amenity 类型

正如我们在有关 语法, 类型上不需要返回基本 类型 - 它们也可以返回其他

例如,我们可以给我们的 Listing 类型一个 amenities - 但这个字段实际上返回什么?

A screenshot of Airlock, focused on a particular listing's amenities

type Listing {
id: ID!
title: String!
description: String!
numOfBeds: Int!
costPerNight: Float!
closedForBookings: Boolean
amenities: # What type should this be?
}

从商业角度来看,我们可以看到有关便利设施的更多详细信息 - 例如其 id、名称、所属类别 - 会很有用。列表提供的便利设施越好或越具描述性,用户就越有可能进行预订!此外,多个列表可能具有相同类型的便利设施;与 idtitle 不同,列表的便利设施可能不是列表本身独有的!

由于这些原因,我们需要将“便利设施”视为一个独立的 - 换句话说,我们应该将其作为自己的 类型称为 Amenity

这意味着我们的 Listing 类型应该更新:我们需要它的 amenities 返回一个 Amenity 类型列表!

使用 amenities 描述更新您的 Listing 类型,并在下面突出显示

type Listing {
id: ID!
title: String!
description: String!
numOfBeds: Int!
costPerNight: Float!
closedForBookings: Boolean
"The amenities available for this listing"
amenities: [Amenity!]!
}

现在,让我们真正定义 Amenity 的样子。从我们的 REST API 响应中,我们知道可以从以下几个属性开始:idnamecategory。在 schema.graphqls 文件中,添加以下所示的新 Amenity 类型:

type Amenity {
id: ID!
"The amenity category the amenity belongs to"
category: String!
"The amenity's name"
name: String!
}

从模式的角度来看,我们的工作已经完成了!

测试 Amenity 类型

现在,当我们重新启动服务器时,DGS 会拾取模式的更改并重新生成我们的 Java 类。我们的 generated 文件夹将有一个新的 Amenity 类,并且 Listing 类将使用返回 - 惊喜! - 的 amenities 属性进行更新 Amenity 实例。我们还将看到 getter 和 setter 以帮助管理此属性。

generated/types/Amenity 代码片段
package com.example.listings.generated.types;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
public class Amenity {
private String id;
/**
* The amenity category the amenity belongs to
*/
private String category;
/**
* The amenity's name
*/
private String name;
// ... constructors, getters & setters
}
任务!

让我们重新编译并跳回 Explorer。我们将尝试运行一个 ,该查询请求列表的 amenities 详细信息。

query GetListing($listingId: ID!) {
listing(id: $listingId) {
title
numOfBeds
amenities {
name
category
}
}
}

并确保在 变量 面板中,我们的 $listingId 仍然设置。

{ "listingId": "listing-1" }

当我们运行 时... 列表的便利设施数据!

备用路径

现在,featuredListings 路径怎么样?它是我们模式的另一个入口点,它返回一个 Listing 类型列表,然后可以访问其 amenities

让我们试试。

GraphQL 操作
query GetFeaturedListings {
featuredListings {
id
title
description
amenities {
id
name
category
}
}
}

哎呀!

响应 面板中出现错误,而不是我们想要的数据。但问题是什么?

错误消息
"The field at path '/listing/amenities' was declared as a non null type,
but the code involved in retrieving data has wrongly returned a null value."

我们能够为 单个 列表返回 amenities 数据,但在尝试为我们每个 精选 列表包含它时,出现了一些问题。

关键要点

  • 一个 可以返回 类型或其他对象类型。
  • 上返回 另一个 时,我们可以编写复杂的查询,从一个对象遍历到另一个对象 - 不需要后续查询!

接下来

让我们调查一下错误的来源并修复它。

上一个

分享您对本课的疑问和评论

本课程目前处于

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

您需要一个 GitHub 帐户才能在下方发布。没有账号? 请改为在 Odyssey 论坛上发布。