解决 GraphQL 变量类型检查问题的方法

阅读时长 8 分钟读完

GraphQL 是一种用于 API 的查询语言,它允许客户端精确地指定需要的数据,从而避免了传统 REST API 中的过度获取或不足获取的问题。然而,在使用 GraphQL 进行查询时,我们经常会遇到变量类型检查问题。本文将介绍一些解决 GraphQL 变量类型检查问题的方法。

问题描述

在 GraphQL 中,我们可以通过变量来传递参数。例如,我们可以通过以下查询获取某个用户的信息:

在上面的查询中,我们定义了一个名为 $id 的变量,并指定了它的类型为 ID!,也就是必须传递一个非空的 ID。然而,在客户端传递变量时,我们很容易出现类型不匹配的问题,例如将一个字符串类型的值传递给了一个期望数字类型的变量。

解决方法

使用 TypeScript

TypeScript 是一种静态类型检查的 JavaScript 超集,它可以帮助我们在编译时发现类型不匹配的问题。在使用 GraphQL 查询时,我们可以使用 graphql-codegen 工具自动生成 TypeScript 类型定义文件,从而在编写客户端代码时获得类型检查的支持。

首先,我们需要安装 graphql-codegen

然后,在项目根目录下创建一个名为 codegen.yml 的文件,用于配置代码生成器。以下是一个示例配置:

在上面的配置中,我们指定了 GraphQL API 的 schema 和查询文件的路径,并配置了三个插件用于生成 TypeScript 文件。其中,typescript-operations 插件可以根据查询文件自动生成对应的 TypeScript 类型定义文件。

接下来,我们可以使用 graphql-codegen 命令生成 TypeScript 文件:

这将会根据配置文件自动生成 TypeScript 文件,并保存在 src/generated/graphql.ts 中。然后,我们就可以在客户端代码中使用这些类型定义了,例如:

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

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

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

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

在上面的代码中,我们使用 GetUserQueryGetUserQueryVariables 类型来指定查询结果和变量的类型,并在查询时传递了一个类型正确的变量。

使用 Joi

Joi 是一个 Node.js 中的对象模式描述语言和验证器,它可以帮助我们对变量进行详细的类型检查和验证。在使用 GraphQL 查询时,我们可以使用 Joi 来对传递的变量进行验证,从而避免类型不匹配的问题。

首先,我们需要安装 joi

然后,我们可以使用以下代码来验证变量:

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

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

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

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

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

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

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

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

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

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

在上面的代码中,我们首先定义了一个 GraphQL schema 和 resolvers,然后定义了一个查询和变量,并使用 Joi.object 来定义变量的验证规则。最后,我们使用 Joi.validate 方法来验证变量是否符合规则,如果验证通过,则执行 GraphQL 查询并返回结果。

使用 Yup

Yup 是一个 JavaScript 对象模式验证器,它可以帮助我们对变量进行详细的类型检查和验证。在使用 GraphQL 查询时,我们可以使用 Yup 来对传递的变量进行验证,从而避免类型不匹配的问题。

首先,我们需要安装 yup

然后,我们可以使用以下代码来验证变量:

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

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

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

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

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

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

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

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

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

在上面的代码中,我们使用 yup.object().shape 来定义变量的验证规则,并使用 yup.validate 方法来验证变量是否符合规则。如果验证通过,则执行 GraphQL 查询并返回结果,否则抛出异常。

总结

在使用 GraphQL 进行查询时,我们经常会遇到变量类型检查问题。本文介绍了三种解决 GraphQL 变量类型检查问题的方法:使用 TypeScript、使用 Joi 和使用 Yup。这些方法都可以帮助我们在客户端代码中获得类型检查的支持,从而提高代码的可靠性和可维护性。

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

纠错
反馈