GraphQL 是一种用于 API 开发的语言,它的优点包括强类型、自描述、数据驱动等,旨在解决 REST API 的一些问题。然而,像所有的 API 一样,GraphQL API 也需要处理参数验证和错误处理。本文将探讨如何在 GraphQL 中处理无效参数。
为什么需要处理无效参数?
对于一个 API,参数验证是很重要的一个部分,它可以保证数据的完整性、正确性,避免恶意攻击,提高应用的可靠性。在 GraphQL 中,通过定义类型来保证参数的正确性,但是有时候我们需要更灵活的根据具体情况处理无效参数。
比如,如果客户端传入了无效的参数,我们不能让服务器崩溃,需要及时发出错误信息告知客户端。
GraphQL 中的参数类型
在 GraphQL 中,每个参数都有相应的类型。如下面的例子,查询用户的信息需要传入的参数是 ID 和 Name:
query getUser($id: Int!, $name:String!){ user(id:$id, name:$name){ 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 类型用作参数,类似这样:
type Query { eventsByMonth(month: Month): [Event] eventsWithinRange(start: DateTime, end: DateTime): [Event] } schema { query: Query }
示例代码
如下所示,当客户传入的数字小于 0,GraphQL 会将错误传回客户端。如果传入的 uid 无效,GraphQL 也会将该错误传回客户端:
-- -------------------- ---- ------- ----- - ------- - - ------------------ ----- ------ - - ---- ----- - -------- ------ ---- - ---- ---- - --- ---- - - ----- --------- - - ----- ------- -- -- - -- --- - -- - ----- --- --------- ---- -- ------- ---- ------ - ----- ---- - ----- --------------- -- ------- - ----- --- -------------- ---- ---- - ------ ---- - - ------ ---------- - ----- ----- - - ----- - -------- --- - -- - - - --- - ----- ------ - ----- --------------- ------ ---------- ---------------------- ------- - ----- ----- - --------------------- ------------ - ----展开代码
以上就是如何在 GraphQL 中处理无效参数的方法,对于参数的错误,我们需要及时捕获这些错误并告知客户端,提高应用的可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67b693fe306f20b3a629f443