在 GraphQL 中构建 Schema

阅读时长 6 分钟读完

GraphQL 是一种用于 API 的查询语言和运行时环境,它提供了一种更加高效、强大和灵活的方式来构建 API。其中最重要的组件之一是 Schema,它定义了 API 中可用的类型、字段和操作。在本文中,我们将深入探讨如何在 GraphQL 中构建 Schema,并提供一些示例代码和指导意义。

前置知识

在深入了解如何构建 GraphQL Schema 之前,您需要掌握以下基本概念:

  • GraphQL 的基本语法和查询结构
  • GraphQL 的类型系统和类型定义语言(Type Definition Language,简称 TDL)
  • GraphQL 的查询和变量

如果您还不熟悉这些概念,可以先学习一些 GraphQL 的基础知识。

构建 Schema

在 GraphQL 中,Schema 是一个重要的概念,它定义了可用于 API 的类型、字段和操作。Schema 通常由两个部分组成:类型定义和解析器。

类型定义

GraphQL 中的类型定义使用 TDL 进行描述,它定义了可用的类型、字段和操作。以下是一些常见的类型定义:

  • Scalar:标量类型,包括 Int、Float、String、Boolean 和 ID。
  • Object:对象类型,由多个字段组成,每个字段都有一个名称和一个类型。
  • Interface:接口类型,定义了一组字段,其他类型可以实现该接口并提供其定义的字段。
  • Union:联合类型,表示多个类型的并集。
  • Enum:枚举类型,表示一组可选值。
  • Input:输入类型,表示一组参数,用于在查询中传递数据。

以下是一个简单的类型定义示例:

-- -------------------- ---- -------
---- ---- -
  --- ---
  ----- -------
  ------ -------
  ---- ---
-

---- ----- -
  -------- ----- ----
  ------ --------
-

----- --------------- -
  ----- -------
  ------ -------
  ---- ---
-

---- -------- -
  ----------------- ------------------ -----
-

上面的示例定义了一个 User 类型,它有 id、name、email 和 age 四个字段。它还定义了一个 Query 类型,它有一个 user 操作和一个 users 操作,用于查询单个用户和多个用户。此外,它还定义了一个 CreateUserInput 输入类型和一个 Mutation 类型,用于创建用户。

解析器

GraphQL 中的解析器是用于处理查询的代码。它负责将查询映射到相应的数据源,并返回结果。解析器通常由以下组成:

  • Resolver 函数:用于处理每个字段的查询。
  • Context 对象:用于在 Resolver 函数之间传递数据。
  • 数据源:用于查询和存储数据的外部系统。

以下是一个简单的解析器示例:

-- -------------------- ---- -------
----- --------- - -
  ------ -
    ----- -------- - -- -- - -- -- -- ------------------ -- ------- --- ----
    ------ -------- ----- - -- -- -- --------
  --
  --------- -
    ----------- -------- - ----- -- - -- -- -- -
      ----- ---- - - --- --------- -------- --
      --------------------
      ------ -----
    -
  -
--

上面的示例定义了一个 resolvers 对象,它包含了 Query 和 Mutation 类型的解析器。每个 Resolver 函数接受三个参数:父级对象、参数和上下文对象。在上面的示例中,我们使用了一个名为 db 的上下文对象,它是一个模拟的数据库对象。

指导意义

在构建 GraphQL Schema 时,需要注意以下几点:

  • 定义清晰的类型:确保每个类型都有明确定义的字段和操作,并尽可能地将它们分组。
  • 使用 TDL:使用 TDL 可以使类型定义更加清晰和易于维护。
  • 考虑查询和变量:在定义类型和字段时,请考虑查询和变量的使用方式,并确保它们易于使用和理解。
  • 分离解析器:将解析器从类型定义中分离出来,这样可以使代码更加清晰和易于维护。
  • 使用上下文对象:使用上下文对象可以使解析器之间更加灵活地共享数据。

示例代码

以下是一个完整的示例代码,其中包含了一个 GraphQL Schema 和一个解析器:

-- -------------------- ---- -------
----- - ------------- --- - - -------------------------
----- - --- ------ - - ----------------

----- -------- - ----
  ---- ---- -
    --- ---
    ----- -------
    ------ -------
    ---- ---
  -

  ---- ----- -
    -------- ----- ----
    ------ --------
  -

  ----- --------------- -
    ----- -------
    ------ -------
    ---- ---
  -

  ---- -------- -
    ----------------- ------------------ -----
  -
--

----- -- - -
  ------ -
    - --- ---- ----- -------- ------ -------------------- ---- -- --
    - --- ---- ----- ------ ------ ------------------ ---- -- --
    - --- ---- ----- ---------- ------ ---------------------- ---- -- -
  -
--

----- --------- - -
  ------ -
    ----- -------- - -- -- - -- -- -- ------------------ -- ------- --- ----
    ------ -------- ----- - -- -- -- --------
  --
  --------- -
    ----------- -------- - ----- -- - -- -- -- -
      ----- ---- - - --- --------- -------- --
      --------------------
      ------ -----
    -
  -
--

----- ------ - --- -------------- --------- --------- ---

----------------------- --- -- -- -
  ------------------- ----- -- ---------
---

在上面的示例中,我们使用了 Apollo Server 来创建一个 GraphQL 服务器。我们定义了一个 typeDefs 变量,它包含了我们在前面的示例中定义的类型定义。我们还定义了一个 resolvers 对象,它包含了我们在前面的示例中定义的解析器。最后,我们使用 Apollo Server 的 listen 方法来启动服务器。

结论

在 GraphQL 中构建 Schema 是使用 GraphQL 构建 API 的重要部分。在本文中,我们深入探讨了如何定义类型、字段和操作,并提供了一些示例代码和指导意义。如果您想要进一步了解 GraphQL,请访问 GraphQL 官方网站。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675816fe5b8c5cbb5f7bec8c

纠错
反馈