对象有效值验证 verify-data-js

492 阅读3分钟

前言

在和后端调接口时,总会出现数据校验的问题,出了问题有时也是一句,我觉得后端会验证的,或者我觉得前端已经校验过了。更直接的就遇见,abc,这个东西你前端校验下,我这边就不校验了。本着提升代码的健壮性,数据校验对我们来说,确实是必不可少的。

刚好最近有些许的空余时间,就自己撸了一个做对象值验证的,感觉能解决平常开发中的大部分校验问题了。当然,为了体现代码的严谨,先把单元测试的结果贴一贴。

test.png

百分百覆盖率,43个测试用例,先别管单元测试咋写的,态度先摆在这里了~

verify-data-js

用于做数据对象中值的验证 github地址:github.com/lyingdog/va…

安装

npm install verify-data-js

使用

const Validator = require('verify-data-js');

const data = {
  arr: [1, 2, 3],
  list: [1, 2, 3, 4]
};

const validate = new Validator(data);

const errs = validate
  .all(["MAX_LENGTH:4", "MIN_LENGTH:1"], '长度不符合规则')
  .allWithout(["MIN_LENGTH:3"], "长度不符合规则")
  .every(v => v.every(n => n > 0), '数值不符合')
  .some(['arr', 'list'], v => v.length > 3, '数组长度不符合')
  .expect('list', "MAX_LENGTH:1", 'list的长度不能大于1')
  .expect('list', "R_EQUAL:5", "巴拉啦小魔仙")
  .relative('arr', 'list', (v1, v2) => v1.length > v2, 'arr的长度不能小于list的长度')
  .compare((data) => {
    console.log('compare get data', data);
    return true;
  }, '测试compare能不能拿到data')
  .end();

console.log('errs', errs);
// [
//   {
//     type: 'every or some',
//     key: 'arr',
//     value: [ 1, 2, 3 ],
//     msg: '数组长度不符合'
//   }, 
//   ****
// ]

使用方法

rules及rules的使用方法
{
  "REQUIRED": "必须输入",
  "IS_DIGITS": "整数",
  "MAX": "最大数字", // MAX:3
  "MIN": "最小数字", // MIN:5
  "MAX_LENGTH": "最大长度", // MAX_LENGTH:5
  "MIN_LENGTH": "最小长度", // MIN_LENGTH:5
  "REGEXP": "正则", // REGEXP:/bbb/
  "PHONE": "电话号码",
  "TEL": "手机号码",
  "EMAIL": "邮件",
  "TYPE": "类型" // TYPE:array
}

后面有注释的即为需要[:value]的rule

api: 
传入的rules可以为字符串或者数组,数组表示需要满足每一个rule "MAX_LENTH:3" || ["MAX_LENGTH:5", "MIN_LENGTH:1"]

// 所有的值都满足传入的rules,msg为需要返回的错误msg
all(rules, msg)

// 除了keys以外的所有值都满足传入的rules,msg为需要返回的错误msg, keys为需要排除的key列表
allWithout(rules, msg, keys = [])

// 指定的值满足传入的rules
expect(key, rules, msg)

// 每个值都满足value条件,value是值,或者callback, data可传可不传,不传默认为this.data
every(value, msg, data)

// 某些值(键名为keys列表中的值)都满足value条件,value是值,或者callback
some(keys, value, msg)

// 比较两个键名为k1,k2值的关系, callback为回调函数, callback(v1, v2)
relative(k1, k2, callback, msg)


//@description 自定义进行比较
//@param callback {function} 比较规则,会传入this.data作为第一个参数
//@param msg {string} 失败后的提示
compare(callback, msg)

// 必须在结尾使用,表示校验完成,返回一个校验有问题的数组,数组length为0,即为验证通过
end()

// 添加自定义的rule,格式为 R_*
static addRule(rule, callback) {
  rules.push(rule);
  rulesMap[rule] = callback;
}

Validator.addRule('R_EQUAL', function (data, value) {
  return data === value;
})

结语

写readme这事,还真太难了。还是硬着头皮写了下来,初步感觉,应该是没啥大问题。反正后续项目中也会用,代码也不是很难。等于练练手,项目总是从小的开始,慢慢做大的嘛。多写一行代码,可能就离梦想更近一步~