📅  最后修改于: 2020-10-25 05:11:07             🧑  作者: Mango
在添加或修改数据时,重要的是验证用户输入。例如,我们可能需要确保字段的值始终不为null。我们可以使用! (不可为空)类型标记在GraphQL中执行此类验证。
使用!的语法类型标记如下-
type TypeName {
field1:String!,
field2:String!,
field3:Int!
}
上面的语法确保所有字段都不为空。
如果我们要实施其他规则,例如检查字符串的长度或检查数字是否在给定范围内,则可以定义自定义验证器。定制验证逻辑将成为解析器函数的一部分。让我们借助示例了解这一点。
让我们创建一个具有基本验证的注册表单。该表格将包含电子邮件,名字和密码字段。
创建一个名为validation-app的文件夹。从终端将目录更改为validation-app。请按照“环境设置”一章中说明的步骤3到5进行操作。
在项目文件夹validation-app中添加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并添加以下代码-
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"
}
}
errors数组包含验证错误的详细信息,如下所示-
{
"data": {
"signUp": null
},
"errors": [
{
"message": "email not in proper format",
"locations": [
{
"line": 2,
"column": 4
}
],
"path": [
"signUp"
]
}
]
}
我们必须为每个字段输入适当的输入,如下所示-
{
"input":{
"email": "abc@abc.com",
"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
}
]
}
]
}