async-graphql/docs/zh-CN/src/input_value_validators.md
2020-09-29 16:06:10 +08:00

2.1 KiB
Raw Blame History

输入值校验器

字段的参数,输入对象(InputObject)的字段在GraphQL中称之为Input Value如果给出的参数值类型不匹配查询会报类型不匹配错误。但有时候我们希望给特定类型的值更多的限制例如我们希望一个参数总是一个格式合法的Email地址我们可以通过自定义标量来解决,但这种类型如果很多,而且我们希望能够进行自由组合,比如一个String类型参数我们希望它既可以是Email地址也可以是一个手机号码自定义标量就特别麻烦。Async-graphql提供了输入值校验器来解决这个问题。

输入值校验器可以通过andor操作符自由组合。

下面时一个参数校验器,它校验String类型的参数a必须是一个合法Email或者MAC地址

use async_graphql::*;
use async_graphql::validators::{Email, MAC};

struct Query;

#[Object]
impl Query {
    async fn input(#[graphql(validator(or(Email, MAC(colon = "false"))))] a: String) {
    }
}

下面的例子校验i32类型的参数a必须大于10并且小于100或者等于0

use async_graphql:*;
use async_graphql::validators::{IntGreaterThan, IntLessThan, IntEqual};

struct Query;

#[Object]
impl Query {
    async fn input(#[validator(
        or(
            and(IntGreaterThan(value = "10"), IntLessThan(value = "100")),
            IntEqual(value = "0")
        ))] a: String) {
    } {
    }
}

自定义校验器

struct MustBeZero {}

impl InputValueValidator for MustBeZero {
    fn is_valid(&self, value: &Value) -> Result<(), String> {
        if let Value::Int(n) = value {
            if n.as_i64().unwrap() != 0 {
                // 校验失败
                Err(format!(
                    "the value is {}, but must be zero",
                    n.as_i64().unwrap(),
                ))
            } else {
                // 校验通过
                Ok(())
            }
        } else {
            // 类型不匹配直接返回None内置校验器会发现这个错误
            Ok(())
        }
    }
}