GraphQL 是一种用于构建 API 的查询语言,它的优点在于可以精确地请求所需的数据,减少了数据传输量,以及可以在一个请求中获取多个资源。然而,当我们使用 GraphQL 时,我们需要确保输入的数据是有效的,因为无效的数据可能会导致错误或安全问题。
在本文中,我们将探讨如何在 GraphQL 中实现数据验证,以确保输入的数据是有效的。
GraphQL 的输入类型
在 GraphQL 中,每个字段都有一个类型,包括输入字段。输入字段的类型被称为输入类型。输入类型可以是标量类型(如字符串、数字等)或自定义类型(如对象、枚举等)。
例如,假设我们有一个 GraphQL 查询,它接受一个名为 newUser
的输入对象:
mutation createUser($newUser: UserInput!) { createUser(input: $newUser) { id name email } }
其中 $newUser
是一个名为 UserInput
的自定义输入类型,它定义了 createUser
操作接受的输入字段。
input UserInput { name: String! email: String! password: String! }
在上面的例子中,我们定义了一个 UserInput
类型,它有三个字段:name
、email
和 password
。每个字段都有一个标量类型 String
,并且 name
和 email
字段都是必需的。
使用 GraphQL 的验证器
GraphQL 提供了一个默认的验证器,它可以验证输入的数据是否符合定义的输入类型。如果输入的数据无效,验证器将返回一个错误。
例如,如果我们使用上面的例子中的 UserInput
类型,但是没有提供 name
或 email
字段,那么验证器将返回以下错误:
-- -------------------- ---- ------- - --------- - - ---------- --------- ------------ --- ------- ----- -------------------------- ----- -------- -- -------- ---- ----------- --- --- ----------- ------------ - - ------- -- --------- -- - - - - -
我们可以看到,验证器返回了一个错误,指出 name
字段未提供,这是一个必需的字段。
自定义验证器
虽然 GraphQL 的默认验证器可以满足大多数情况,但是有时我们需要自定义验证器来实现更复杂的验证逻辑。
例如,假设我们需要验证电子邮件地址是否是唯一的。我们可以使用自定义验证器来检查数据库中是否已经存在相同的电子邮件地址。
首先,我们需要定义一个自定义标量类型 Email
,它将电子邮件地址转换为字符串类型,并在转换过程中验证电子邮件地址是否有效。我们可以使用 email-validator
库来验证电子邮件地址。
-- -------------------- ---- ------- ----- - ------------------ ------------ - - ------------------- ----- --------- - --------------------------- ----- --------- - --- ------------------- ----- -------- ------------ ---- ------- ------ ---- ---------- -- ----- --------- ---------------- - -- ---------------------------- - ----- --- --------------------- ----- -------- ----------- - ------ ------ -- ----------------- - -- ---------------------------- - ----- --- --------------------- ----- -------- ----------- - ------ ------ -- ----------------- - -- --------- --- ------------ - ----- --- ----------------- ---- -------- ------- -- ----- --------- --- --- -- -------------- - -- -------------------------------- - ----- --- --------------------- ----- -------- --------------- - ------ ---------- -- ---
在上面的代码中,我们定义了一个名为 EmailType
的自定义标量类型,它将电子邮件地址转换为字符串类型,并在转换过程中验证电子邮件地址是否有效。如果电子邮件地址无效,它将抛出一个 GraphQLError
错误。
现在,我们可以在我们的输入类型 UserInput
中使用自定义标量类型 Email
,并在 email
字段上添加一个自定义验证器来验证电子邮件地址是否唯一。
input UserInput { name: String! email: Email! @unique password: String! }
在上面的例子中,我们使用 @unique
指令来标记 email
字段,表示它需要进行唯一性验证。我们可以使用 graphql-directive-validate
库来实现这个自定义指令。
-- -------------------- ---- ------- ----- - ---------------------- - - ------------------------- ----- --------------- ------- ---------------------- - -------------------------------- - ----- - ------- - -------------- - - ---------- ----- - ----- ---- - - ------ ------------- - ----- -------- -------- ----- -------- ----- - ----- ----- - ----------- ----- ------ - --- -- ----- -- --- ----- -- ------ ----- ----- - ----- ------------------------------------- ------ ----- ------------- -- ------------- - -- - ------------------ ------- ---------- -- ------- -- ------ - -- ---- --- ------- -------- ----- ------ - ----- --------------- ----- -------- ------ -- ------ --- ------ -- ----- -- ----- -- -------------- - -- - ----- --- --------------------------- ---- - ---- - ------ ------- - -- - - -------------- - ----------------
在上面的代码中,我们定义了一个名为 UniqueDirective
的指令,它在 visitInputFieldDefinition
方法中访问输入字段,然后添加一个自定义验证器来验证电子邮件地址是否唯一。如果电子邮件地址不唯一,它将抛出一个 GraphQLError
错误。
结论
在本文中,我们学习了如何在 GraphQL 中实现数据验证。我们了解了 GraphQL 的输入类型和验证器,并使用自定义标量类型和指令来实现更复杂的验证逻辑。
GraphQL 的数据验证可以确保输入的数据是有效的,并促进了更好的安全性和可靠性。它是构建高质量 API 的关键步骤之一,值得我们深入学习和实践。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675eb4d1e49b4d07161995ed