数据模型声明及校验工具,借鉴了 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()
: 用于检查字符串数据,返回StringType
T.number()
: 用于检查数值数据,返回NumberType
T.boolean()
: 用于检查布尔型数据,返回BooleanType
T.date()
: 用于检查日期数据,返回DateType
T.object()
: 用于检查对象数据,返回ObjectType
T.array()
: 用于检查数组数据,返回ArrayType
T.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 || CheckResult
type.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('用户名'))
})