import validation from 'san-validation';
let validate = validation(mySchema);
let {isValid, errors} = validate(inputForm);
if (!isValid) {
reportErrors(errors);
}
let message = {
type: 'Invalid ${description} type',
categoryId: {
type: 'Invalid ${description} type'
},
tags: {
minItems: 'There should be no less than ${minItems} ${description}',
uniqueItems: 'Duplicate ${description}',
items: {
type: '${description} should be ${type}s',
maxLength: 'Each ${description} should have no more than ${maxLength} characters'
}
},
sales: {
items: {
year: {
minimum: '${description} is too early'
},
month: {
minimum: '${description} should fall within 1 - 12',
maximum: '${description} should fall within 1 - 12'
},
quantity: {
minimum: 'Need a positive ${description}'
}
}
}
}
[
{path: 'categoryId', keyword: 'type', message: 'Invalid category type'},
{path: 'tags', keyword: 'uniqueItems', message: 'Duplicate tags'},
{path: 'tags.0', keyword: 'maxLength', message: 'Each tag of product should have no more than 30 characters'},
{path: 'tags.1', keyword: 'maxLength', message: 'Each tag of product should have no more than 30 characters'},
{path: 'tags.2', keyword: 'type', message: 'tag of product should be strings'},
{path: 'sales.0.year', keyword: 'minimum', message: 'sales year is too early'},
{path: 'sales.0.month', keyword: 'maximum', message: 'sales month should fall within 1 - 12'},
{path: 'sales.0.quantity', keyword: 'minimum', message: 'Need a positive sales quantity'},
]
san-validation
san-validation提供了一系列简单的函数,基于jsen实现对象的验证,验证使用JSON Schema作为对象描述,返回错误信息与jsen一致。本类库的
validation模块(也即主模块)为一个函数,称之为validation函数,其签名如下:该函数返回一个函数,用于对输入进行校验,校验返回一个对象,结构如下:
其中
errors对象为jsen返回的结果,具体请查看jsen的相关API。普通的使用方法:
消息分离
在一些业务中,同样的JSON Schema会用于不同的视图界面,在不同的界面则要应用不同的错误信息。本类库支持将JSON Schema中的结构描述与错误信息进行分离,这么做也可以让schema更纯粹地描述一个对象的结构,而与校验有关的信息则在实际进行校验时再提供。
使用
validation函数的第二个参数可以对原有的schema添加错误信息,假设我们的原schema如下:对应的
message对象如下:在
message对象中,可以使用${xxx}占位符输出,占位符可用的内容与这个字段的schema中的属性对应,但并不会向上或向下找父字段/子字段的相关属性。validation函数会将message中的各个错误消息合并到schema中,大致的合并算法如下:invalidMessage和requiredMessage直接与原schema合并,从message中移除这2个属性message的每个属性,如果值为字符串则是一个错误消息模板,如果是对象则为更进一步的属性-错误信息配置。message中错误信息提取出来,作为messages属性与原schema合并type为object,则作为properties与原schema合并type为array,则提取items属性与原schema合并因此基于上面的结构,我们可以进行校验:
这样我们可以得到以下的错误
errors对象:可以看到每一个错误对象都使用了
message配置中对应的消息,对于数组则使用的items中配置的消息。默认错误信息
大部分业务项目有一套默认的错误信息规则,如所有“必填”字段的提示均为“XXX字段为必填项”,我们不希望每次编写schema时都对这些字段一一指明错误信息,因此
san-validation提供了支持默认错误信息的功能。validation模块的withDefaultMessages函数接收一个默认消息配置对象,返回一个新的validation函数。默认消息配置对象的每个键对应一个错误类型(如
type、minLength、maximum等),值为一个函数,该函数接收当前字段的schema,需要返回错误信息字符串。我们通常推荐一个项目独立一个模块提供自己的
validation函数,可在这个模块内配置默认错误信息,如编写一个common/validation.js文件,可以使用以下代码提供默认的错误信息:其它模块则直接使用项目中的
validation模块:基于源码构建
除了包目录下的
validation.js和validation.min.js外,可以直接基于src目录下的源码进行构建,需要使用babel及es2015预设集。