如何理解 GraphQL 中的 Schema

阅读时长 8 分钟读完

GraphQL 是一种强类型、统一的查询语言,它通过定义一种叫作 Schema 的数据模型来定义 API,使得前端开发者可以更高效、更灵活地请求数据。在 GraphQL 中,Schema 是定义数据结构和查询规范的重要组成部分。本文将详细介绍 GraphQL 中的 Schema 概念与用法。

什么是 Schema

Schema 是 GraphQL 中的核心概念,用于描述 API 的类型系统。它定义了可查询的字段及其返回类型、输入参数及其类型、查询所需的对象类型,以及对象类型之间的关系。在完整的 GraphQL Schema 中,不仅仅包含类型定义,还包含查询、变量、指令等方面的定义。

下面是一个简单的 GraphQL Schema 定义示例:

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

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

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

上述 Schema 定义了三个类型:Query、User 和 Post,Query 类型定义了两个查询字段:user 和 posts,其中 user 查询接收一个 ID 类型的参数,并返回一个 User 类型的对象,posts 查询则返回一个 Post 类型的对象数组。User 和 Post 类型分别定义了与之对应的字段和类型。

Schema 的作用

Schema 是 GraphQL 的数据模型,它定义了可查询的字段及其类型、输入参数及其类型、查询所需的对象类型,以及对象类型之间的关系。Schema 的作用主要体现在以下三个方面:

1. 定义查询规范

GraphQL Schema 定义了 API 的查询规范,前端开发者可以通过查询规范来请求 API,并得到所需的数据。Schema 的定义可以通过一种叫做 GraphQL SDL(Schema Definition Language)的语言来完成,SDL 可以让 Schema 定义更加易懂、易读。通过 Schema,前端开发者可以清晰地了解查询 API 中所需的数据结构和字段信息,从而编写出更加精确的查询语句。

2. 规范化和类型检查

GraphQL 强调类型的一致性,Schema 可以帮助开发者在请求数据过程中进行类型检查。在 GraphQL 中,Schema 定义了不同类型的对象和字段,因此会发现每个查询的子字段都有一个明确的类型,并且父字段的类型必须与它所包含的子字段的类型匹配。从类型安全的角度来看,Schema 可以帮助开发者避免一些编码时错误,降低程序运行时的错误率。

3. 反向工程

Schema 的定义可以让开发者清晰地了解整个 API,因此可以方便地在后端进行反向工程。GraphQL 的 Schema 具有自解释性,也就是说,前端开发者可以通过查询 Schema 来了解整个 API 中所有对象的类型、字段、查询规范等信息,这使得后端开发者可以更加了解前端需要的数据和查询规范,有助于更好地设计和开发 API。

如何定义 Schema

GraphQL Schema 的定义可以通过一种叫做 GraphQL SDL 的语言来完成,它是一种基于文本的 Schema 定义语言,类似于 JSON,但更加可读性和可维护性。

下面将介绍如何通过 GraphQL SDL 定义 Schema。

定义对象类型

GraphQL 的对象类型是定义 API 的基本类型。首先,我们定义一个对象类型 User:

上述 User 对象类型定义了四个字段:id、name、email 和 age,其中 id、name 和 email 字段是必需的,而 age 字段是可选的。

定义查询类型

查询类型是 GraphQL 的根类型,它是定义查询的起点。在定义查询类型时,需要将其命名为 Query 类型,例如:

上述查询类型定义了两个查询字段:user 和 users。其中,user 查询接收一个 ID 类型的参数,并返回一个 User 类型的对象,而 users 查询则返回一个 User 对象数组。

定义枚举

枚举是 GraphQL 中的一种标量类型,它定义了一组可用的常量值。例如:

上述定义了 UserRole 枚举类型,其中包含了三个常量值:ADMIN、MEMBER 和 GUEST。

定义联合类型

在 GraphQL 中,联合类型是一种复合类型,它允许我们返回多种不同的类型。定义联合类型时,可以使用 | 符号来分隔不同类型。例如:

上述定义了 SearchResult 联合类型,它可以作为查询结果返回 User、Post 或 Comment 类型的对象。

定义接口类型

接口类型是 GraphQL 的一种类型,它定义了一组可选的字段和类型(与其他类型相同)以及实现该接口所必须的字段。例如:

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

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

上述定义了一个 Node 接口类型,其中包含了一个 id 字段。接着,定义了一个 User 类型,并使用 implements 关键字表明它实现了 Node 接口中定义的 id 字段,使得 User 类型也包含 id 字段。

如何使用 Schema

定义好 Schema 后,需要在 API 中注册并启用 Schema。通过使用 GraphQL 的相关库,API 可以解析传入的查询请求,然后使用 Schema 中定义的结构来自动处理查询,并返回符合查询规范的数据。本节将介绍一些流行的工具和框架,来展示如何使用 GraphQL Schema。

Apollo Server

Apollo Server 是一种完整的 GraphQL 服务器,可以帮助我们快速开发和部署 GraphQL API。以下示例代码展示了如何使用 Apollo Server 创建 GraphQL API 并注册 Schema:

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

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

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

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

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

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

上述代码中,我们首先使用 gql 函数定义 Schema 的类型,然后通过 resolvers 对象定义查询函数的解析方法。最后,我们创建 ApolloServer 实例并传入 typeDefs 和 resolvers,然后启动服务器并监听端口。

GraphQL Yoga

GraphQL Yoga 是一个快速、灵活和易于使用的 GraphQL 服务器和中间件库,其底层基于 Express 和 Apollo Server。以下示例代码展示了如何使用 GraphQL Yoga 创建 GraphQL API 并注册 Schema:

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

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

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

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

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

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

上述代码中,我们使用 typeDefs 定义了 GraphQL Schema,并通过 resolvers 定义了查询函数的解析方法。最后,我们创建 GraphQLServer 实例并将 typeDefs 和 resolvers 传入,然后启动服务器并监听端口。

总结

本文介绍了 GraphQL 中的 Schema 概念与作用,以及如何定义和使用 GraphQL Schema。Schema 定义了一个 API 的类型系统,规范了查询规范和类型检查,还可以在前后端之间提供一种反向工程的方式。通过了解和掌握 GraphQL Schema,前端开发者可以更高效、更灵活地请求数据。最后,我们还介绍了一些流行的工具和框架,可以帮助我们在项目中使用 GraphQL Schema。

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

纠错
反馈