概述
我们快要完成列表详细信息页面所需的数据了。让我们继续添加便利设施!
在本课中,我们将
- 介绍
Amenity
类型到我们的模式中 - 构建查询以显示列表及其所有便利设施的数据
构建 Amenity
类型
正如我们在有关SDL 语法,字段 在 GraphQL 类型上不需要返回基本 标量 类型 - 它们也可以返回其他 对象类型!
例如,我们可以给我们的 Listing
类型一个 amenities
字段 - 但这个字段实际上返回什么?
type Listing {id: ID!title: String!description: String!numOfBeds: Int!costPerNight: Float!closedForBookings: Booleanamenities: # What type should this be?}
从商业角度来看,我们可以看到有关便利设施的更多详细信息 - 例如其 id、名称、所属类别 - 会很有用。列表提供的便利设施越好或越具描述性,用户就越有可能进行预订!此外,多个列表可能具有相同类型的便利设施;与 id
或 title
不同,列表的便利设施可能不是列表本身独有的!
由于这些原因,我们需要将“便利设施”视为一个独立的 实体 - 换句话说,我们应该将其作为自己的 GraphQL 类型称为 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 响应中,我们知道可以从以下几个属性开始:id
、name
和 category
。在 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 以帮助管理此属性。
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) {titlenumOfBedsamenities {namecategory}}}
并确保在 变量 面板中,我们的 $listingId
变量 仍然设置。
{ "listingId": "listing-1" }
当我们运行 查询 时... 列表的便利设施数据!
备用路径
现在,featuredListings
路径怎么样?它是我们模式的另一个入口点,它返回一个 Listing
类型列表,然后可以访问其 amenities
字段。
让我们试试。
query GetFeaturedListings {featuredListings {idtitledescriptionamenities {idnamecategory}}}
哎呀!
在 响应 面板中出现错误,而不是我们想要的数据。但问题是什么?
"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
数据,但在尝试为我们每个 精选 列表包含它时,出现了一些问题。
关键要点
- 一个 对象类型 的 字段 可以返回 标量 类型或其他对象类型。
- 当 字段 在 对象类型 上返回 另一个 对象类型 时,我们可以编写复杂的查询,从一个对象遍历到另一个对象 - 不需要后续查询!
接下来
让我们调查一下错误的来源并修复它。
分享您对本课的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下方发布。没有账号? 请改为在 Odyssey 论坛上发布。