自定义验证

定义类型

acr 的验证规则都是在某种类型之上的,在开始定义规则之前,首先要定义一个类型。我们也提供了一些默认类型

acr.type('date', { foo: 'bar' });

定义类型使用 acr.type 方法,这个方法接受两个参数,nameoptions

name 是一个唯一字符串,因此,即使你多次定义同一个名称的类型,得到的都是同一个实例。

options 是一个对象,具体的内容还没有确定,这块目前只是一个预留选项。

自定义验证

我们业务中可能有一些重复使用的验证规则,这个时候我们可以定义一个规则来重复使用。

比如我们可能需要判断用户提交的日期是否是闰年。

acr.type('date')
    .define('leapYear', (value, { params }) => {
        const is = (value % 4 == 0) && (value % 100 != 0 || value % 400 == 0);
        
        return is ? true : params[0] : false;
    });

使用

// 会抛出一个 ValidationError,因为 2018 不是闰年
await acr.date().leapYear().validate('2018'); 

规则定义方法 define 接受两个参数。

name 规则名称,在同一种类型下唯一,重复定义时,后面的定义会覆盖前面的。

rule 规则闭包,规则闭包接受 两个参数,分别是 value 和 一些辅助验证的数据 context。详情参考规则闭包

规则闭包

规则闭包接受 两个参数,分别是 value 和 一些辅助验证的数据 context

value 是此验证链上的值。

context 是用于辅助验证的数据。目前包含以下结构:

  • data 是此次验证的全部数据,某些情况下,可能需要获取相关联的数据来进行验证。

  • path 此次验证的路径名称。

  • identify 字符串,可以视为是规则的唯一标识,由type和rule的名称组成。比如上面的日期验证,identify 就是 date.leapYear ,有时候参数发生错误为了便于快速定位问题,可以附带进错误提示。

  • params 数组,验证时传递的全部参数。我们希望所有的规则的最后一个参数都是一个可选的 message 参数。

  • context 上下文,等于定义 acr 时传递的 context 内容。参考 配置

闭包的返回值可以是多种类型。但除了 stringfalse 之外的返回值,都会认为是验证成功。

如果返回一个 string,会将这个 string 作为错误的 message

Last updated