GraphQL 错误处理:处理无效参数

阅读时长 6 分钟读完

GraphQL 是一种用于 API 开发的语言,它的优点包括强类型、自描述、数据驱动等,旨在解决 REST API 的一些问题。然而,像所有的 API 一样,GraphQL API 也需要处理参数验证和错误处理。本文将探讨如何在 GraphQL 中处理无效参数。

为什么需要处理无效参数?

对于一个 API,参数验证是很重要的一个部分,它可以保证数据的完整性、正确性,避免恶意攻击,提高应用的可靠性。在 GraphQL 中,通过定义类型来保证参数的正确性,但是有时候我们需要更灵活的根据具体情况处理无效参数。

比如,如果客户端传入了无效的参数,我们不能让服务器崩溃,需要及时发出错误信息告知客户端。

GraphQL 中的参数类型

在 GraphQL 中,每个参数都有相应的类型。如下面的例子,查询用户的信息需要传入的参数是 ID 和 Name:

上面的参数 id 和 name 对应的类型分别是 Int 和 String。GraphQL 支持的基本类型包括 Scalar 和 Enum。

处理无效参数的方法

使用 GraphQL Schema Validation

GraphQL Schema Validation 可以验证我们所定义的 Schema 是否合法,包括类型、字段、变量等。当客户端请求 GraphQL API 时,服务器会验证 Query(Mutation 或 Subscription)的语法结构和类型定义,来保证请求有效。类型定义体现在 Schema 中,如下所示:

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

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

------ -
  ------ -----
-
展开代码

如果在验证中发现类型不匹配或未定义的操作,GraphQL 会返回错误信息。

使用 union 或 interface 做特殊处理

对于一些复杂的条件,我们可以用 union 或 interface 来进行特殊处理。如下面限制 user 的查询条件必须为 ID 或 username:

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

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

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

------ -
  ------ -----
-
展开代码

这里我们定义了 一个 UserIDorUsername 类型,并使用 union 将 User 和 Username 做了一个集合。这就意味着,在查询时,查询参数 idOrUsername 必须是 User 或者 Username 类型。这种方法可以很好地解决一些具体场景的无效参数问题。

开发自定义的 GraphQL Directive

我们可以使用自定义的 GraphQL Directive,识别特殊的参数,进行特殊的处理。比如,开发一个 @checkLength Directive,检查输入的 String 是否符合长度要求

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

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

------ -
  ------ -----
-
展开代码

在上述的 GraphQL Schema 中,参数 firstName 加上了 @checkLength Directive,它的 min 和 max 分别表示最小长度和最大长度。在请求时,GraphQL 服务器将会根据自定义指令对传入的参数进行验证。

GraphQL Scalar Types - Enum

GraphQL Enum 是一种字段类型,它的值集合是有限的,定义一组可命名的值。Enum 类型也可以用于参数类型的定义。

下面是一个 Month 类型的例子:

-- -------------------- ---- -------
---- ----- -
  -------
  --------
  -----
  -----
  ---
  ----
  ----
  ------
  ---------
  -------
  --------
  --------
-
展开代码

在 GraphQL 中,我们可以将这个 Month 类型用作参数,类似这样:

示例代码

如下所示,当客户传入的数字小于 0,GraphQL 会将错误传回客户端。如果传入的 uid 无效,GraphQL 也会将该错误传回客户端:

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

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

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

------ ---------- -
  ----- ----- - -
    ----- -
      -------- --- -
        --
      -
    -
  -
  --- -
    ----- ------ - ----- --------------- ------ ----------
    ---------------------- -------
  - ----- ----- -
    --------------------- ------------
  -
----
展开代码

以上就是如何在 GraphQL 中处理无效参数的方法,对于参数的错误,我们需要及时捕获这些错误并告知客户端,提高应用的可靠性。

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

纠错
反馈

纠错反馈