validator.js
一个简单的数据验证对象,适用于浏览器与node环境。
use
install:
npm install -S vdjs
const Validator = require('vdjs')
var valid = Validator.validate(data, {})
浏览器中使用:
<script type="text/javascript" src="dist/validator.min.js"></script>
demo
var validator = require('./dist/validator.js')
// 待验证数据
var data = {
name: 'validator',
nickname: 'validator.js',
password: '123456',
confirm_password: '1234561'
}
// 验证数据
var valid = validator.validate(data, {
name: [
{required: true, msg: 'name字段不能为空'},
{type: String, msg: 'name字段必须是字符串'},
{length: [3, 20], msg: 'name字段保持3~20字符'},
],
nickname: {length: [3, 20], msg: 'nickname字段保持3~20字符'},
password: {required: true, not: '123456', min: 6, msg: 'password验证不通过'},
confirm_password: {eq: data.password, msg: '两次输入密码不一致'}
})
console.log(valid.fails(), valid.valider(), valid.has('name'), valid.all(true))
API
validator:
-
validator.validate(data, constraints [, isOne])
验证数据,返回验证结果对象Analyzerdata
待验证数据constraints
数据限制要求isOne
检查到错误字段即停止
-
validator.pushRule(type, fun)
添加规则 -
validator.Rule[type](val, rval)
验证,返回bool;如:validator.Rule.between(50, [20, 100])
返回true
Analyzer:
Analyzer.prototype.all(isArr)
返回所有验证信息结果,对象;如果需要返回数组isArr
为true
即可。Analyzer.prototype.fails()
检查是否失败,如果存在字段检查不通过,则返回true,反之falseAnalyzer.prototype.has(field)
判断字段是否存在错误,返回BooleanAnalyzer.prototype.get(field, isOrigin)
获取字段错误信息Analyzer.prototype.first(field)
返回指定字段的第一条错误信息Analyzer.prototype.last(field)
返回指定字段的最后一条错误信息Analyzer.prototype.valider()
返回验证对象
constraints
constraints
数据限制
用法:
validator.validate(data, constraints)
constraints格式:
字段: {规则名: 规则值, msg: '提示信息'}
例:
{
name: {
required: true, msg: '用户名必须存在'
},
nickname: [
{required: true, not: '', msg: '不能为空'}, //可以存在两个rule,共用msg
{type: String, msg: '昵称必须是字符串'},
{length: [3, 20], msg: '昵称长度3~20字符,(包含3与20)'}
]
}
Rule
required
验证字段必须存在,undefined
为不存在。eq
值相等;{eq: '123456', msg: '必须是123456'}
。not
非。type
符合的数据类型,支持String
,Object
,Array
,Number
,Boolean
,Date
, …包括自定义对象 (除null
,undefined
)。length
长度,支持数组与字符串数据;{length: 6, msg: '值必须6位'}
或者{length: [6, 20], msg: '6~20字符'}
。min
大于等于,支持数字,字符串。max
小于等于。gt
大于 > 。gte
大于等于 >= (同min)。lt
小于 < 。lte
小于等于 <= (同max)。between
数字范围;{between: [6, 20]}
注:字符串比较问题'60' >= '100'
;如:待验证值100,{between: ['60', '100']}
。notBetween
不在范围。in
在里面,支持数组,对象,字符串;{in: ['aa', 'bb']}
,{in: 'this is a test', msg: ''}
。notIn
不在里面。match
匹配正则;{match: /abc$/, msg: '必须以abc结尾'}
。notMatch
不匹配正则。like
模糊匹配,类似sql中的like规则;例如:{like: 'abc%', '必须以abc开头'}
。notLike
like
反义。email
匹配邮箱;内部正则:/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
,可能存在一些不匹配情况。upperCase
匹配大写。lowerCase
匹配小写。run
自定义执行过程,执行函数必须同步返回,暂不支持async/await;例如:{run: (id) => {return true}, msg: ''}
。
required
在不提供 required
规则的情况或者required: true
时,只有data中对应字段不为undefined才会输出其他规则匹配结果。
例如:
var data = {}
var valid = validator.validate(data, {
name: {length: 12, msg: '长度必须是12'}
})
这里 valid.fails()
结果是 false
的。
var data = {name: 'abc'}
var valid = validator.validate(data, {
name: {length: 12, msg: '长度必须是12'}
})
这里 valid.fails()
结果是 true
的。
以上两种情况,增加 required: false
是一样的结果。
自定义Rule
// 添加回文规则
validator.pushRule('palindromic', function (val, rval) {
if (rval) {
console.log(val.split('').reverse())
return val.split('').reverse().join('') === val
}
return true
})
http请求验证例子
http请求需要注意的是空字段的问题,比如 xxx?query=
, query
字段值是空的字符串,而不是null
var valid = validator.validate(ctx.request.body, {
email: [
{required: true, not: '', msg: '邮箱不能为空'},
{match: /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/, msg: '邮箱格式不对'}
],
name: [
{required: true, not: '', msg: '名字不能为空'}
],
tel: [
{required: true, not: '', msg: '电话号码不能为空'},
{match: /^1[3|4|5|7|8][0-9]{9}$/, msg: '手机号码格式不正确'}
]
})
喜欢的朋友欢迎start交流,谢谢,打扰了。
先加单元测试更重要些
并没有想要
@fightAndLearn 这个,单元测试,目前还不打算加入
挺喜欢你的项目,和它的用途,最近我也在做类似的功能。 我是watsons.js的开发者,目前正在谨慎考虑和增加form validation的功能。 watsons.js被react的prop-types启发,有很强的扩展能力,和元编程能力。 用法多样,类似以下几种,但过于风骚的用法不推荐,比如下面的第一种 watsons.presented.uppercase.string.which.matches(/[A-Z]{11}/), watsons.oneOf([‘male’, ‘female’]).required, watsons.year(2017).before(today).after(lastMonth), watsons.arrayOf(watsons.string), watsons.shape({ a: watsons.string.required, b: watsons.bool, c: watsons.oneOfType([ watsons.string, watsons.null ]), d: watsons.number.between([18, 80]) }) 这种普通用法,适合服务器参数验证,适合编程,不具备可i18n的展示给用户错误信息的能力,所以需要增加可自定义错误信息的功能,而表单验证通常错误信息是一条一条的规则,所以设计并实现了rule和rules这两种api。
watsons.collectMessages(ctx.request.body, {
email: watsons.rules([
[watsons.string.present, "邮箱不能为空"],
[watsons.string.match(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/), "邮箱格式不对"]
]),
name: watsons.rule([watsons.string.present, "名字不能为空"]),
tel: watsons.rules([
[watsons.string.validateWith(isEmpty), "电话号码不能为空"],
[watsons.string.match(/^1[3|4|5|7|8][0-9]{9}$/), "手机号码格式不正确"]
]),
});
数据格式验证,是开发,保证正常运行,及网络安全方面的重要内容,如果在各方面,就包括mongoose和react都能使用同一套系统,则会大大提高开发效率,代码重用程度,降低学习成本。
你现在正在做着这个,如果你有兴趣,是否愿意讨论下比如项目远景,或是合并项目,或是共同开发方面的问题?
@cheunghy 感觉你这个项目比较厉害些,目前我还写不出很强的插件,能结交牛人,学习交流当然是非常乐意的