GraphQL Validation 验证用户输入
添加或修改数据时,验证用户输入很重要。例如,我们可能需要确保某个字段的值始终不为空。我们可以使用GraphQL 中的(不可为空的)类型标记 !
来执行此类验证。
使用!
的语法 类型标记如下所示
type TypeName {
field1:String!,
field2:String!,
field3:Int!
}
上述语法确保所有字段都不为空。
如果我们想实现额外的规则,比如检查字符串的长度或检查数字是否在给定范围内,我们可以定义自定义验证器。自定义验证逻辑将成为解析器功能的一部分。让我们通过一个例子来理解这一点。
让我们创建一个带有基本验证的注册表单。该表单将包含电子邮件、名字和密码字段。
一、下载并安装项目所需的依赖项
创建一个名为validation-app
的文件夹 。从终端将目录更改为 validation-app。按照开发环境的搭建中说明的步骤 3 到 5 完成下载和安装过程。
二、 创建Schema
在项目文件夹validation-app中添加schema.graphql文件 并添加以下代码
schema.graphql
type Query { greeting:String } type Mutation { signUp(input:SignUpInput):String } input SignUpInput { email:String!, password:String!, firstName:String! }
注意
- 我们可以使用输入类型 SignUpInput 来减少 signUp 函数中的参数数量。因此,signUp 函数只接受一个类型为 SignUpInput 的参数。
三、创建解析器
在项目文件夹中创建一个文件 resolvers.js并添加以下代码
resolvers.js
const Query = { greeting:() => "Hello" } const Mutation ={ signUp:(root,args,context,info) => { const {email,firstName,password} = args.input; const emailExpression = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; const isValidEmail = emailExpression.test(String(email).toLowerCase()) if(!isValidEmail) throw new Error("email not in proper format") if(firstName.length > 15) throw new Error("firstName should be less than 15 characters") if(password.length < 8 ) throw new Error("password should be minimum 8 characters") return "success"; } } module.exports = {Query,Mutation}
解析器函数 signUp 接受参数 email、password 和 firstName。这些将通过输入变量传递,以便可以通过 args.input 访问它。
四、运行应用程序
创建 server.js 文件并参考开发环境的搭建章节中的步骤 8。下一步是在终端中执行命令 npm start。服务器将在 9000 端口上启动并运行。在这里,我们使用 GraphiQL 作为客户端来测试应用程序。打开浏览器并输入 URL,http://localhost:9000/graphiql。
在编辑器中输入以下查询
mutation doSignUp($input:SignUpInput) {
signUp(input:$input)
}
由于注册函数的输入是复杂类型,我们需要在 graphiql 中使用查询变量。为此,我们需要首先为查询命名并称之为 doSignUp,$input 是一个查询变量。
必须在 graphiql 的查询变量选项卡中输入以下查询变量
{
"input":{
"email": "abc@abc",
"firstName": "kannan",
"password": "pass@1234"
}
}
响应如下
{
"data": {
"signUp": "success"
}
}
在这里,在下面的查询中,我们没有分配任何密码。
{
"input":{
"email": "abc@abc.com",
"firstName": "kannan"
}
}
如果未提供必填字段,则 qraphql 服务器将显示以下错误 -
{
"errors": [
{
"message": "Variable \"$input\" got invalid value {\"email\":\"abc@abc.com\",\"firstName\":\"kannan\"}; Field value.password of required type String! was not provided.",
"locations": [
{
"line": 1,
"column": 19
}
]
}
]
}