GraphQL 是一种用于 API 的查询语言和运行时环境,它可以让客户端定义所需数据的结构。它提供了一种更加高效、强大、灵活的方式来获取和修改数据,同时还具有强大的数据校验功能。本文将介绍基于 GraphQL 的数据变更及数据校验的方法实现,并提供示例代码,帮助读者更好地理解和使用 GraphQL。
数据变更
Mutation
在 GraphQL 中,Mutation 是一种特殊的类型,它用于修改数据。Mutation 类型包含一组字段,每个字段都代表一个可以执行的操作。例如,我们可以定义一个名为 addUser 的 Mutation,用于添加新用户:
type Mutation { addUser(name: String!, email: String!): User! }
该 Mutation 接受两个必填参数 name 和 email,并返回一个 User 类型的对象。通过这种方式,我们可以在客户端发起一个 addUser 的 Mutation 请求,并传递需要添加的用户信息,服务端会根据请求的参数执行相应的操作,并返回新创建的用户信息。
Input
在 Mutation 中,我们经常需要传递一个复杂的参数对象,例如添加用户时需要传递一个包含多个字段的用户对象。为了简化参数的传递,GraphQL 提供了 Input 类型。Input 类型与普通类型类似,但是它们只用于输入参数,并且不能作为返回类型。例如,我们可以定义一个名为 UserInput 的 Input 类型,用于传递用户信息:
input UserInput { name: String! email: String! }
然后在 addUser Mutation 中使用 UserInput 类型作为参数:
type Mutation { addUser(user: UserInput!): User! }
这样,我们就可以将 addUser 的参数改为一个包含多个字段的 UserInput 对象,而不是多个独立的参数。
数据校验
GraphQL 提供了一种强大的数据校验功能,可以在服务端执行数据校验,并在校验失败时返回错误信息。GraphQL 的数据校验功能基于 Schema 和 Type System,因此需要在 Schema 中定义每个字段的类型、默认值和校验规则。
Scalars
在 GraphQL 中,Scalars 是一种特殊的类型,用于表示标量值,例如 String、Int、Float、Boolean、ID 等。每个 Scalar 类型都有一个预定义的解析器,用于将字符串类型的输入值转换为相应的标量值。例如,GraphQL 的 String 类型的解析器将字符串值转换为字符串类型的标量值。
除了预定义的 Scalars,我们还可以自定义 Scalars,例如,我们可以定义一个名为 Date 的 Scalar,用于表示日期类型:
scalar Date
然后在 Schema 中使用该 Scalar 类型:
type User { name: String! email: String! birthdate: Date! }
这样,在客户端发起查询请求时,如果传递的 birthdate 不符合 Date 的格式要求,服务端就会返回错误信息,告诉客户端 birthdate 的格式不正确。
Directives
在 GraphQL 中,Directives 是一种特殊的语法,用于在 Schema 中为字段添加元数据和自定义行为。例如,我们可以在 Schema 中定义一个名为 @length 的 Directive,用于校验字符串的长度:
directive @length(max: Int!) on FIELD_DEFINITION type User { name: String! @length(max: 20) email: String! @length(max: 50) }
这样,在客户端发起查询请求时,如果传递的 name 或 email 的长度超过了指定的最大长度,服务端就会返回错误信息,告诉客户端 name 或 email 的长度超过了最大长度。
Custom Validation
除了 Scalars 和 Directives,我们还可以使用自定义的校验逻辑,例如,我们可以定义一个名为 validateEmail 的函数,用于校验 email 的格式:
function validateEmail(email: String): Boolean { // 校验 email 的格式 } type Mutation { addUser(name: String!, email: String!): User! @validateEmail }
这样,在 addUser Mutation 中添加了 @validateEmail Directive,服务端会在执行 Mutation 前先调用 validateEmail 函数进行校验,如果校验失败,就会返回错误信息。
示例代码
下面是一个基于 GraphQL 的数据变更及数据校验的示例代码,用于添加新用户并校验用户信息:
-- -------------------- ---- ------- ------ ---- --------- ------------ ----- -- ---------------- ---- ---- - ----- ------- ------------ --- ------ ------- ------------ --- ---------- ----- - ----- --------- - ----- ------- ------ ------- ---------- ----- - ---- -------- - ------------- ------------ ----- ------------- - -------- ------------------ ----------- ------- - -- ------ -- ---------------------------- - ----- --- -------------- ----- --------- - -- ----------------- - --- - ----- --- ----------- -- --- ------- - -- ------------------ - --- - ----- --- ------------ -- --- ------- - ------ ----- - -------- -------------------- -------- ------- - -- -- ----- --- ------ ----- -
在该示例代码中,我们定义了一个名为 addUser 的 Mutation,用于添加新用户。该 Mutation 接受一个 UserInput 类型的参数,其中包含 name、email 和 birthdate 三个字段。在 addUser Mutation 中添加了 @validateUser Directive,服务端会在执行 Mutation 前先调用 validateUser 函数进行校验,如果校验失败,就会返回错误信息。在 validateUser 函数中,我们校验了 email 的格式,以及 name 和 email 的长度,如果校验失败,就会返回错误信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67da268ca941bf71341e1dd0