GraphQL 是一种用于 API 的查询语言和运行时环境,广泛用于前端开发。在 GraphQL 中,开发者可以通过定义自己的类型系统来描述 API 中可用的数据。但是,当用户发起查询时,输入的数据往往需要进行验证,以确保数据的正确性和安全性。本文将介绍 GraphQL 中的输入验证方法,以及如何使用这些方法来保护你的应用程序,避免潜在的问题。
GraphQL 中的输入类型
在 GraphQL 中,所有的输入都表示为类型。例如,一个简单的查询可能具有以下输入:
{ user(id: "123") { name } }
这个查询中的 id
是一个字符串,它传递给 user
字段作为参数。在 GraphQL 中,我们需要使用输入类型来表示这个参数。输入类型描述了查询时可以使用的输入,并定义了每个输入的类型和值的验证方法。
在 GraphQL 中,有三种输入类型:
- 标量类型:标量类型是原始类型,例如字符串或数字,它们的验证方法由 GraphQL 核心库提供。
- 枚举类型:枚举类型是一组具有预定义值的标量类型。它们的验证方法由 GraphQL 核心库提供。
- 自定义输入类型:自定义输入类型是用户定义的输入类型,它们描述了一个复杂的输入参数,由开发者提供验证方法。
GraphQL 输入验证的目的
输入验证是一项重要的工作,它可以在 GraphQL 中完成。这是因为 GraphQL 定义了一种类型系统,可以允许开发者定义特定的输入类型,从而保证传递给 GraphQL 的输入参数始终与定义匹配。
输入验证的目的是确保传递给 GraphQL 的输入参数是:
- 有效的:输入参数的格式正确,包括类型、范围和格式等等。
- 安全的:输入数据没有潜在的安全问题,例如 SQL 注入。
- 一致的:输入参数与预期的数据类型和对应值类型一致。
GraphQL 输入验证方法
在 GraphQL 中,有许多输入验证方法,开发人员可以根据需求自由选择使用。下面是一些常用的输入验证方法:
内置的标量类型验证
GraphQL 内置了许多标量类型,例如 Int、Float、String、Boolean 和 ID 等等。这些标量类型的验证方法由 GraphQL 核心库提供,它们会自动验证输入参数是否符合标量类型。
例如,如果一个查询的输入参数应该是一个字符串,然而传递给它的是一个数字,则 GraphQL 将返回错误信息,指出输入是无效的。
query { user(id: 123) { name } }
返回结果:
-- -------------------- ---- ------- - --------- - - ---------- --------- ---- ------- ----- ------ ------------ - - ------- -- --------- - - - - - -
自定义标量类型验证
开发者还可以通过自定义标量类型来验证特定的数据类型。例如,假设我们需要验证一个输入参数是否是一个有效的邮箱地址,我们可以定义一个自定义标量类型来验证。
scalar Email type Query { user(email: Email): User }
定义 Email 标量类型的验证方法:
-- -------------------- ---- ------- ----- --------- - --- ------------------- ----- -------- ---------------- - -- -------- -- ----------------------- - ----- --- ------------------- -------- -- ----------- - ------ ------ -- ----------------- - -- -------- -- ----------------------- - ----- --- ------------------- -------- -- ----------- - ------ ------ -- ----------------- - -- --------- --- ------------ - ----- --- ---------------------- ---- ------- ----- -------------- ------- - -- -------- -- --------------------------- - ----- --- ------------------- ------------ -- ---------- ------- - ------ ---------- -- ---
使用自定义标量类型 Email
:
{ user(email: "john@example.com") { name } }
枚举类型验证
枚举类型是一种特殊的标量类型,它只接受特定的一组预定义值。在 GraphQL 中,开发人员可以使用枚举来表示一组可能的输入值,这些输入值是被限制的。例如,以下是一个枚举类型:
-- -------------------- ---- ------- ---- ----- - --- ----- ---- - ---- ----- - -------------- ----- -
使用枚举类型:
{ favoriteColor }
如果传入了无效的值,将返回一个错误信息。
{ favoriteColor(color: "YELLOW") }
错误信息:
-- -------------------- ---- ------- - --------- - - ---------- --------- ------- --- ------- ----- ----------- ------------ - - ------- -- --------- -- - - - - -
自定义输入类型验证
自定义输入类型可以包含多个字段,并使用验证方法来确保输入值的正确性。例如,以下是一个自定义输入类型:
-- -------------------- ---- ------- ----- --------------- - ----- ------- ------ ------- --------- ------- - ---- -------- - ----------------- ----------------- ---- -
创建用户输入类型的验证方法:
-- -------------------- ---- ------- ----- ------------------- - --- ------------------------ ----- ------------------ ------- -- -- -- ----- - ----- --- ------------------------------ -- -------- --------- ----------------- -- ------ - ----- --- ------------------------------ -- ------------- --------- ------------------ --------------- -- --------- - ----- --- ------------------------------ -- ------ --------- ------- -- - -- ------------- - -- - ----- --- ---------------------- ---- ---- -- ----- - -------------- - ------ ------ -- -- --- ---
使用自定义输入类型 CreateUserInput
:
-- -------------------- ---- ------- -------- - ----------- ------ - ----- ------- ------ ------------------- --------- ------------- - - - -- ---- ----- - -
如果传递了无效的输入值,将返回一个错误信息。
-- -------------------- ---- ------- -------- - ----------- ------ - ----- --- ------ ---------------- --------- ---------- - - - -- ---- ----- - -
错误信息:
-- -------------------- ---- ------- - --------- - - ---------- --------- ------- --- ------- ----- --- -------- ---- -------------------- ------------ - - ------- -- --------- - - -- ------------- - ------------------- - - ------------ ------- ---------- ---- ----- ----- ------ -- ---------- -- - ------------ -------- ---------- ------ --------------- -- --------- -- - ------------ ----------- ---------- --------- ---- ---- -- ----- - ------------ - - - - - -
结论
在 GraphQL 中,输入验证是确保数据安全性和正确性的重要环节。使用 GraphQL 的输入验证方法可以保证输入值的有效性、安全性和一致性。GraphQL 提供了多种输入验证方法,包括标量类型、枚举类型和自定义输入类型。开发者可以根据自己的需求选择适合自己的验证方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67319a220bc820c5823969f8