寻找轻量级的验证器,可以看下
https://github.com/node-modules/parameter
https://javascript.net.cn/article?id=732
安装
npm install @hapi/joi --save
npm install joi --save
用法示例
const Joi = require('@hapi/joi');
const schema = Joi.object({
username: Joi.string()
.alphanum()
.min(3)
.max(30)
.required(),
password: Joi.string()
.pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
repeat_password: Joi.ref('password'),
access_token: [
Joi.string(),
Joi.number()
],
birth_year: Joi.number()
.integer()
.min(1900)
.max(2013),
email: Joi.string()
.email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
})
.with('username', 'birth_year')
.xor('password', 'access_token')
.with('password', 'repeat_password');
schema.validate({ username: 'abc', birth_year: 1994 });
// -> { value: { username: 'abc', birth_year: 1994 } }
schema.validate({});
// -> { value: {}, error: '"username" is required' }
// Also -
try {
const value = await schema.validateAsync({ username: 'abc', birth_year: 1994 });
}
catch (err) { }
例子解释
The above schema defines the following constraints:
上面这些模式,定义了如下约束:
username
a required string 【必填字段】
must contain only alphanumeric characters 【只能包含 a-z, A-Z, and 0-9】
at least 3 characters long but no more than 30 【最少三个字符,不能超过30个字符】
must be accompanied by birth_year 【用户名和生日都必须填写】
password
an optional string 【可选择的字符串】
must satisfy the custom regex pattern 【必须满足自定义正则表达式】
cannot appear together with access_token 【不能和 access_token 同时出现】
must be accompanied by repeat_password and equal to it【必须和 repeat_password 同时出现,并且相同】
access_token
an optional, unconstrained string or number 【可选的,可以是字符串或者数字】
birth_year
an integer between 1900 and 2013 【整型数据,范围1900-2013】
a valid email address string 【必须是一个邮件地址字符串】
must have two domain parts e.g. example.com 【域名必须包含两个部分,比如 example.com】
TLD must be .com or .net 【域名后缀是 .com 或 .net 】
验证规则
对一个字段的基本的验证规则是:
类型 / 长度范围 / 取值范围 / 是否必填 / 与其它字段的关系 / 默认值
1、类型
//任意类型
any()
//指定类型
array()
boolean()
binary()
date()
func()
number()
object()
string()
类型下还有子约束,如下面的integer()、alphanum()等:
//Requires the number to be an integer (no floating point).
Joi.number().integer(),
//Requires the string value to only contain a-z, A-Z, and 0-9.
Joi.string().alphanum()
Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/),
Joi.string().email()
注1:除了 类型约束 ,其他约束都叫 子约束
注2:先写 类型约束 才能继续“点写” 子约束
注3:类型约束 和 子约束 的适用关系详看:https://github.com/hapijs/joi/blob/v13.4.0/API.md
注4:any() 类型 下的 子约束 可以应用在其它任意类型下
枚举类型可以参考下面的3 - (1)
2、长度范围
min() / max()
Joi.number().min(2)
Joi.array().max(5)
3、取值范围
(1) valid - 白名单
可以用来实现枚举类型
a: Joi.any().valid('a'),
b: Joi.any().valid('b', 'B'),
c: Joi.any().valid(['c', 'C'])
(2) invalid - 黑名单
a: Joi.any().invalid('a'),
b: Joi.any().invalid('b', 'B'),
c: Joi.any().invalid(['c', 'C'])
(3) allow - 白名单的补充
a: Joi.any().allow('a'),
b: Joi.any().allow('b', 'B'),
c: Joi.any().allow(['c', 'C'])
4、是否必填
只对 undefined有效,null 会认为不合法
Joi.any().required()
代码见下面的6 - (2)
5、与其它字段的关系
(1) with / without / or
如现在有 a、b 两个字段:
const schema = Joi.object().keys({
a: Joi.any(),
b: Joi.any()
}).with('a', 'b');
a.with('a', 'b') //a 和 b 必须都要填写
b.without('a', 'b'); //a 和 b 只能填写其中一个
c.or('a', 'b') //b 和 b 至少填写一个
(2) when
需求:验证条件是男人必须 50-100 岁,女人必须 0-50岁
const schema = Joi.object().keys({
name: Joi.string().min(2).max(20).required(),
age: Joi.number().min(0).max(100).required().when('sex', {
is: '男',
then: Joi.number().min(50).max(100),
otherwise: Joi.number().min(0).max(50),
}),
sex: Joi.string().valid(['男', '女']),
})
const result = Joi.validate({ name: '小明', age: 60, sex: "女" }, schema);
6,对多余传进来的变量不要理会
options 参数加上 { allowUnknown: true }
参考:
https://hapi.dev/module/joi/#example
https://blog.csdn.net/weixin_30748995/article/details/96281213
https://github.com/node-modules/parameter