GraphQL 作为一种查询语言,具有强大而灵活的查询功能,但是在开发过程中,为了保证数据的准确性和安全性,我们需要对用户提交的参数进行验证,特别是当参数只能是特定值中的一个时,使用 GraphQL 的枚举类型来限制参数类型非常方便,那么,在 GraphQL 中如何强制执行枚举验证呢?
枚举类型简介
枚举类型(Enum)是一种数据类型,用于定义一组有限的常数。在 GraphQL 中,枚举类型用于表示只能是特定值中的一个参数。比如,考虑下面这个查询:
query getOrder($status: OrderStatus!) { order(status: $status) { id amount status } }
这个查询中的 OrderStatus
是一个枚举类型,它能够限制参数 status
只能是 NEW
, PROCESSING
或 COMPLETED
中的一个值。
在 GraphQL 的 Schema 中定义枚举类型和普通类型一样。比如,定义一个名为 OrderStatus
的枚举类型:
enum OrderStatus { NEW PROCESSING COMPLETED }
强制执行枚举验证
默认情况下,GraphQL 不会强制执行枚举类型的验证,也就是说,如果客户端提交了一个不在枚举类型中的值,GraphQL 也会返回查询结果。比如,如果客户端提交了一个无效的 OrderStatus
值,GraphQL 会返回下面的结果:
-- -------------------- ---- ------- - ------- - -------- - ----- ------ --------- ---- --------- ---------------- - - -
为了强制执行枚举验证,在 GraphQL 的 Schema 中,需要定义一个自定义的 Scalar
类型来代替默认的 String
类型。比如,定义名为 EnumValue
的 Scalar
类型:
scalar EnumValue
在 Resolver 中,使用 EnumValue
类型作为参数类型,处理参数时需要对客户端提交的参数进行验证,只有当参数是枚举类型中的一个值时才返回真正的查询结果。比如,定义名为 order
的 Resolver:
-- -------------------- ---- ------- ---- ----- - ------------- ------------ ----- - ---- ----- - --- -- ------- --- ------- ----------- - ---- ----------- - --- ---------- --------- - ------ --------- ---- -------- - ------ - ------ ------- - ------ -- --------- -- - -- ---------------------------------------------- - ----- --- -------------- ----------- ------ ------------ - -- --------- ------ - --- ------ ------- ---- ------ -- - - -
现在,如果客户端提交了一个无效的 OrderStatus
值,GraphQL 会返回下面的结果:
-- -------------------- ---- ------- - --------- - - ---------- -------- ----------- ------ ---------------- ------------ - - ------- -- --------- - - - - - -
这个错误信息准确地告诉客户端提交了无效的值,让客户端能够快速定位问题并进行修复。
总结
在 GraphQL 中强制执行枚举验证,需要重新定义一个 Scalar 类型来代替默认的 String 类型,并在 Resolver 中对客户端提交的参数进行验证。通过这种方式,我们能够保证数据的准确性和安全性,让客户端能够快速定位问题并进行修复。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646f1e36968c7c53b0d838c3