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 的长度,如果校验失败,就会返回错误信息。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67da268ca941bf71341e1dd0