Skip to content

Latest commit

 

History

History
87 lines (62 loc) · 4.67 KB

ch04_01.md

File metadata and controls

87 lines (62 loc) · 4.67 KB

定义类型

了解 GraphQL 类型和模式的最佳方法是构建一个。照片共享应用程序将允许用户使用他们的 GitHub 帐户登录以发布照片并在这些照片中标记用户。管理用户和帖子代表了几乎所有类型的互联网应用程序的核心功能。

PhotoShare 应用程序将有两种主要类型:用户和照片。让我们开始为整个应用程序设计模式。

类型

任何 GraphQL Schema 的核心单元都是类型。在 GraphQL 中,类型代表自定义对象,这些对象描述了应用程序的核心功能。例如,社交媒体应用程序由用户和帖子组成。博客将由类别和文章组成。这些类型代表您的应用程序的数据。

如果您要从头开始构建 Twitter,帖子将包含用户希望广播的文本。(在这种情况下,Tweet 可能是该类型的更好名称。)如果您正在构建 Snapchat,则 Post 将包含图像并且更恰当地命名为 Snap。在定义模式时,您将定义一种您的团队在讨论领域对象时将使用的通用语言。

类型中用字段表示与其它对象关联的数据。每个字段返回特定类型的数据。字段可能是一个整数或一个字符串,但它也可能是一个自定义对象类型或类型列表。

模式是类型定义的集合。您可以将模式作为字符串写入 JavaScript 文件或任何文本文件中。这些文件通常带有 .graphql 扩展名。

让我们在模式文件中定义第一个 GraphQL 对象类型——照片:

type Photo {
  id: ID!
  name: String!
  url: String!
  description: String
}

在大括号之间,我们定义了照片的字段。照片的 url 是对图像文件位置的引用。此描述还包含有关照片的一些元数据:名称和描述。最后,每张照片都会有一个 ID,一个唯一的标识符,可以用作访问照片的键。

每个字段包含特定类型的数据。我们在我们的模式中只定义了一种自定义类型,即照片,但 GraphQL 附带了一些我们可以用于我们的字段的内置类型。这些内置类型称为标量类型。description、name 和 url 字段使用 String 标量类型。我们查询这些字段时返回的数据将是 JSON 字符串。感叹号指定该字段不可为空,这意味着 name 和 url 字段必须在每个查询中返回一些数据。描述可以为空,这意味着照片描述是可选的。查询时,该字段可能返回 null。

照片的 ID 字段指定每张照片的唯一标识符。在 GraphQL 中,当应返回唯一标识符时使用 ID 标量类型。此标识符的 JSON 值将是一个字符串,但此字符串将被验证为唯一值。

标量类型

GraphQL 的内置标量类型(Int、Float、String、Boolean、ID)非常有用,但有时您可能想要定义自己的自定义标量类型。标量类型不是对象类型。它没有字段。但是,在实现 GraphQL 服务时,您可以指定应如何验证自定义标量类型; 例如:

scalar DateTime
type Photo {
  id: ID!
  name: String!
  url: String!
  description: String
  created: DateTime!
}

在这里,我们创建了一个自定义标量类型:DateTime。现在我们可以找出每张照片的创建时间。任何标记为 DateTime 的字段都将返回一个 JSON 字符串,但我们可以使用自定义标量来确保该字符串可以被序列化、验证和格式化为官方日期和时间。您可以为需要验证的任何类型声明自定义标量。

NOTE
graphql-custom-types npm 包中有一些常用的自定义标量类型,您可以将它们快速添加到 Node.js GraphQL 服务中。

枚举

枚举类型(enum)是允许字段返回一组限制性字符串值的标量类型。当你想确保一个字段从一组有限的值中返回一个值时,你可以使用枚举类型。例如,让我们创建一个名为 PhotoCategory 的枚举类型,它定义了从一组五个可能的选项中发布的照片类型:SELFIE、PORTRAIT、ACTION、LANDSCAPE 或 GRAPHIC:

enum PhotoCategory {
  SELFIE
  PORTRAIT
  ACTION
  LANDSCAPE
  GRAPHIC
}

您可以在定义字段时使用枚举类型。让我们向我们的照片对象类型添加一个类别字段:

type Photo {
  id: ID!
  name: String!
  url: String!
  description: String
  created: DateTime!
  category: PhotoCategory!
}

现在我们已经添加了类别字段,我们将确保它在我们实现服务时返回五个有效值之一。

NOTE
您的实现是否完全支持枚举类型并不重要。您可以使用任何语言实现 GraphQL 枚举字段。

👈 上一节 下一节 👉