如何在 GraphQL 中强制执行枚举验证

阅读时长 4 分钟读完

GraphQL 作为一种查询语言,具有强大而灵活的查询功能,但是在开发过程中,为了保证数据的准确性和安全性,我们需要对用户提交的参数进行验证,特别是当参数只能是特定值中的一个时,使用 GraphQL 的枚举类型来限制参数类型非常方便,那么,在 GraphQL 中如何强制执行枚举验证呢?

枚举类型简介

枚举类型(Enum)是一种数据类型,用于定义一组有限的常数。在 GraphQL 中,枚举类型用于表示只能是特定值中的一个参数。比如,考虑下面这个查询:

这个查询中的 OrderStatus 是一个枚举类型,它能够限制参数 status 只能是 NEW, PROCESSINGCOMPLETED 中的一个值。

在 GraphQL 的 Schema 中定义枚举类型和普通类型一样。比如,定义一个名为 OrderStatus 的枚举类型:

强制执行枚举验证

默认情况下,GraphQL 不会强制执行枚举类型的验证,也就是说,如果客户端提交了一个不在枚举类型中的值,GraphQL 也会返回查询结果。比如,如果客户端提交了一个无效的 OrderStatus 值,GraphQL 会返回下面的结果:

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

为了强制执行枚举验证,在 GraphQL 的 Schema 中,需要定义一个自定义的 Scalar 类型来代替默认的 String 类型。比如,定义名为 EnumValueScalar 类型:

在 Resolver 中,使用 EnumValue 类型作为参数类型,处理参数时需要对客户端提交的参数进行验证,只有当参数是枚举类型中的一个值时才返回真正的查询结果。比如,定义名为 order 的 Resolver:

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

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

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

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

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

现在,如果客户端提交了一个无效的 OrderStatus 值,GraphQL 会返回下面的结果:

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

这个错误信息准确地告诉客户端提交了无效的值,让客户端能够快速定位问题并进行修复。

总结

在 GraphQL 中强制执行枚举验证,需要重新定义一个 Scalar 类型来代替默认的 String 类型,并在 Resolver 中对客户端提交的参数进行验证。通过这种方式,我们能够保证数据的准确性和安全性,让客户端能够快速定位问题并进行修复。

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

纠错
反馈