数据模型声明及校验工具,借鉴了 rsuite/schema-typed 项目。
通过为数据声明模型(Schema),再基于模型对数据进行校验。
import { SchemaModel, T } from '@luobotang/schema-validate'
const model = SchemaModel({
name: T.string('姓名').required(),
age: T.number('年龄').range(18, 30)
})
model.check({
name: 'foo',
age: 40
})
// 结果:
// {
// name: { hasError: false },
// age: { hasError: true, errorMessage: '年龄应在 18 到 30 之间' }
// }SchemaModel 用于声明模型,T.string 等用于声明不同数据类型校验对象。
构造函数:
-
Schema(schemaDefinition: Object)传入数据结构声明对象,例如:
new Schema({ name: T.string('姓名').required() age: T.string('年龄').range(18, 30) })
方法:
-
schema.check(data: Object) => Object {String: CheckResult}检查整个对象,返回各个属性的检查结果,例如:
schema.check({ name: 'abc', age: 18 }) // 返回: result = { name: { hasError: false }, age: { hasError: true, errorMessage: 'xxx' } }
-
schema.validate(data: Object) => CheckResult检查整个对象,返回第一个检查失败的属性及结果,例如:
schema.validate({ name: 'abc', age: 18 }) // 返回: result = { hasError: true, errorMessage: 'xxx', field: 'age' }
CheckResult 数据结构:
- hasError: Boolean,是否校验失败
- errorMessage: String,错误信息
- field: String,出错字段
用于简化创建 Schema,等同于 new Schema(schemaDefinition)。
用于创建各种类型检查对象,包括:
T.string(): 用于检查字符串数据,返回StringTypeT.number(): 用于检查数值数据,返回NumberTypeT.boolean(): 用于检查布尔型数据,返回BooleanTypeT.date(): 用于检查日期数据,返回DateTypeT.object(): 用于检查对象数据,返回ObjectTypeT.array(): 用于检查数组数据,返回ArrayTypeT.any(): 检查传入的多个类型,任意类型满足即可,返回AnyType,例如T.any(T.string(), T.number())
所有类型对象都继承自 Type 类:
Type(name, desc)type.check(value, data)type.rule(onValid, errorMessage, priority): 添加一条数据校验规则,onValid为(value, data) => Boolean || CheckResulttype.required(errorMessage = '不能为空', trim = true): 设置当前数据项不能为空,数据校验时进行非空校验type.desc(desc): 设置用于错误信息的数据描述type.clone(): 复制得到当前类型对象的副本实例
校验方法都返回当前对象,方便链式调用。校验方法的 errorMessage 都有缺省值。
校验方法:
hasLetter(errorMessage)hasUppercaseLetter(errorMessage)hasLowercaseLetter(errorMessage)letterOnly(errorMessage)hasNumber(errorMessage)numberOnly(errorMessage)isInteger(errorMessage)isNumber(errorMessage)numberOnly(errorMessage)isInteger(errorMessage)isNumber(errorMessage)isFloat(errorMessage)isDouble(errorMessage)oneOf(list, errorMessage)email(errorMessage)ip(errorMessage)url(errorMessage)hex(errorMessage)pattern(regex, errorMessage): 通过传入的正则表达式对数据进行校验range(min, max, errorMessage)minlen(min, errorMessage)maxlen(max, errorMessage)length(len, errorMessage)same(field, errorMessage): 与当前对象中其他字段值进行比对,不一致返回错误
校验方法:
integer(errorMessage)range(min, max, errorMessage)min(min, errorMessage)max(max, errorMessage)oneOf(list, errorMessage)
对可以转为合法日期的字符串、数值、日期对象进行校验,如果需要严格约定类型,可以添加 date.strict() 规则进行约束。
校验方法:
range(min, max, errorMessage)min(min, errorMessage)max(max, errorMessage)strict(errorMessage)
声明嵌套对象,使用方式:
SchemaModel({
name: T.string('姓名').require(),
address: T.object('地址').required().shape({
province: T.string('省份').required(),
city: T.string('城市').required()
})
})校验方法:
range(min, max, errorMessage)minlen(min, errorMessage)maxlen(max, errorMessage)length(len, errorMessage)unique(errorMessage)uniqueKey(key, errorMessage)of(type)
其中 of(type) 用于对数组元素类型进行校验,例如:
SchemaModel({
users: T.array('用户列表').of(T.string('用户名'))
})