数据验证器
### 简介
这是一个数据验证器,方便快速验证数据是否符合指定的规则。
主要是用来结合测试用例使用,快速验证响应数据格式
[视频教程](https://www.bilibili.com/video/BV1nh411974p?p=9)
### 导入
地址:`https://files-1255322048.cos.ap-chengdu.myqcloud.com/static/js/validator1.0.js`
### Basic
```javascript
const validator = new Validator({
// 指定一些具名测试函数 Specify some named test functions
mobile(val){
return /^1[3456789]\d{9}$/.test(val)
}
})
(async ()=>{
const valid = await validator.validate('15600001111', 'mobile')
// 等同于
// const valid = await validator.v('15600001111', 'mobile')
// true
})()
```
### 预设的测试函数
- truthy - 真值
- falsy - 假值
- object - 对象
- number - 数值
- string - 字符串
- truthyString - 非空字符串
- boolean - 布尔值
- null - null/undefined
- completeNull - null
- completeUndefined - undefined
- function - function
- array - array
- any - 任何类型
```javascript
module.exports = {
truthy(val){
return !!val
},
truthyString(val){
return !!val && typeof val === 'string'
},
falsy(val){
return !val
},
object(val){
return val && typeof val === 'object'
},
number(val){
return typeof val === 'number'
},
string(val){
return typeof val === 'string'
},
boolean(val){
return typeof val === 'boolean'
},
null(val){
return val == null
},
completeNull(val){
return val === null
},
completeUndefined(val){
return val === undefined
},
function(val){
return typeof val === 'function'
},
array(val){
return val instanceof Array
},
any(){
return true
}
}
```
### 规则的写法
一条规则可以是字符串,正则表达式,数组,对象或者自定义函数
#### 使用字符串
##### 调用默认/自定义的测试函数
```javascript
validator.v('12', 'number')
```
##### 逻辑与/或的字符串写法
```javascript
assert(!await validator.v([1, 2], 'object && number'))
assert(await validator.v([1, 2], 'object && array'))
assert(!await validator.v([1, 2], 'string || number'))
assert(await validator.v([1, 2], 'object || number'))
```
##### 简单表达式(判断相等/表达式)
```javascript
// >
assert(await validator.v(12, '>10'))
// >=
assert(await validator.v(12, '>=12'))
// <=
assert(await validator.v(12, '<=12'))
// =
assert(await validator.v(12, '=12'))
assert(await validator.v('12', '=12'))
assert(await validator.v('abcdefg', '=abcdefg'))
assert(await validator.v(' abc defg', '= abc defg'))
assert(!await validator.v(' abc defg', '= abc defg '))
// 如果要判断类型,则需要使用 && 来进行指定
assert(!await validator.v(12, 'string && =12'))
assert(await validator.v(12, 'number && =12'))
```
#### 使用数组表示逻辑与
```javascript
validator.v('12', ['string', /1/, /2/])
```
#### 使用对象
```javascript
validator.v({
a: '12',
b: 12,
c: null
}, {
b: 'number',
a: 'string',
c: null
})
```
##### 使用$
```javascript
validator.v({
a: '123124124',
b: 1241231,
c: null
}, {
// key后加$ 表示可以不存在,否则必须存在
a$: 'string',
b: 'number',
// 字符规则后加$表示可以为null/undefined
c: 'number$',
// $表示被验证的对象本身
$: 'object',
// $subItem 表示当前验证被验证对象/数组下的所有值,表示...obj或...array
$subItem: 'truthy',
// $or 表示一条规则,表示验证对象需要至少符合数组内的任一项
$or: ['string' , 'object'],
})
```
##### 使用$来描述复杂的require关系
```javascript
validator.v({
a: '123124124',
b: 1241231,
c: null
}, {
//当a存在是 c必须存在,a不存在时,c也可以不存在
a$: 'string',
b: 'number',
c$: 'null',
$(val){
if(val.a){
return val.c !== undefined
}else{
return true
}
}
}
```
##### 使用字符串[]来描述数组中的类型
```javascript
/*
array[number]规则表示{
$: 'array',
$subItem: 'number'
} 的语法糖
*/
validator.v([12, 13, 12343], 'array[number]')
```
#### 递归验证的例子
```javascript
validator.addPresetRule('person', {
name: 'truthyString',
age: 'number',
children$: 'array[person]$'
})
validator.addPresetRule('people', 'array[person]')
const data = [{
name: '龙一',
age: 55,
children: [{
name: '龙二',
age: 32
}]
}, {
name: '落一',
age: 45,
children: [{
name: '落二',
age: 12
}]
}]
validator.v(data, 'people')
```
#### 转义$
```javascript
validator.v({
a$: 1,
}, {
a$$: 'number',
})// Promise.resolve(true)
await validator.v({
$: 1,
}, {
$$: 'number',
})// Promise.resolve(true)
!await validator.v({
$listItem: 1,
}, {
$$listItem: 'string',
})// Promise.resolve(false)
```