这样的validator.js是不是你想要的呢?
发布于 1 个月前 作者 mengdu 2273 次浏览 来自 分享

validator.js

一个简单的数据验证对象,适用于浏览器与node环境。

github

文档

在线例子

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]) 验证数据,返回验证结果对象Analyzer

    • data 待验证数据
    • constraints 数据限制要求
    • isOne 检查到错误字段即停止
  • validator.pushRule(type, fun) 添加规则

  • validator.Rule[type](val, rval) 验证,返回bool;如:validator.Rule.between(50, [20, 100]) 返回 true

Analyzer

  • Analyzer.prototype.all(isArr) 返回所有验证信息结果,对象;如果需要返回数组 isArrtrue 即可。
  • Analyzer.prototype.fails() 检查是否失败,如果存在字段检查不通过,则返回true,反之false
  • Analyzer.prototype.has(field) 判断字段是否存在错误,返回Boolean
  • Analyzer.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交流,谢谢,打扰了。

10 回复

先加单元测试更重要些

@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 感觉你这个项目比较厉害些,目前我还写不出很强的插件,能结交牛人,学习交流当然是非常乐意的

@cheunghy 这个厉害,有 github 链接吗?

@leopku 文档开头不是有连接么

还是加好单测重要些~

最好有单测…

another-json-schema (100%测试覆盖率)

用法

const AJS = require('another-json-schema')

const userSchema = AJS('userSchema', {
  name: { type: 'string', required: true },
  age: { type: 'number', gte: 18 },
  gender: { type: 'string', enum: ['male', 'female'], default: 'male' }
})

// test `required`
console.log(userSchema.validate({ age: 18 }))
/*
{ valid: false,
  error:
   { TypeError: ($.name: undefined) ✖ (required: true)
     validator: 'required',
     actual: undefined,
     expected: { type: 'string', required: true },
     path: '$.name',
     schema: 'userSchema' },
  result: { age: 18 } }
*/

// test `default`
const data = { name: 'nswbmw', age: 18 }
console.log(userSchema.validate(data))
/*
{ valid: true,
  error: null,
  result: { name: 'nswbmw', age: 18, gender: 'male' } }
*/
console.log(data)
// { name: 'nswbmw', age: 18, gender: 'male' }

// test `enum`
console.log(userSchema.validate({ name: 'nswbmw', age: 18, gender: 'lalala' }))
/*
{ valid: false,
  error:
   { TypeError: ($.gender: "lalala") ✖ (enum: male,female)
     validator: 'enum',
     actual: 'lalala',
     expected: { type: 'string', enum: ['male', 'female'], default: 'male' },
     path: '$.gender',
     schema: 'userSchema' },
  result: { name: 'nswbmw', age: 18, gender: 'lalala' } }
*/

// test `gte`
console.log(userSchema.validate({ name: 'nswbmw', age: 17 }))
/*
{ valid: false,
  error:
   { TypeError: ($.age: 17) ✖ (gte: 18)
     validator: 'gte',
     actual: 17,
     expected: { type: 'number', gte: 18 },
     path: '$.age',
     schema: 'userSchema' },
  result: { name: 'nswbmw', age: 17 } }
*/
回到顶部