在编写api的时候通常都需要对参数进行校验,包括:
Joi 是 hapijs 自带的数据校验模块,他已经高度封装常用的校验功能。
安装及使用:
npm install joi --save
import Joi from 'joi'
使用joi进行校验,首先要定义它的校验规则,也叫schema。
const schema = Joi.string()
上面就定义了一个校验字符串类型的规则,这个schema会有一个 validate方法,传入需要校验的值:
const result = schema.validate('1')
console.log(result)
// 此时result为 { value: '1' }
validate方法会返回一个对象,如果验证通过,就只会返回value属性,如果验证错误,就还有一个error对象,其中error对象的message描述了失败原因:
const schema = Joi.string()
const result = schema.validate(1)
console.log(result)
// result:
{
value: 1,
error: [Error [ValidationError]: "value" must be a string] {
_original: 1,
details: [ [Object] ]
}
}
console.log(result.error.message)
// "value" must be a string
Joi.string().allow('').required()
Joi.number().min(18).max(35)
Joi.array().items(Joi.string()).length(3)
Joi.object({
p1: Joi.string()
})
Joi.func()
Joi.date()
Joi.any()
Joi.string().pattern(/\d/ig)
Joi.empty()
const schema = Joi.object({
age: Joi.number().valid(14, 16, 18),
childAge: Joi.number().valid(Joi.in('age')),
childAgeBack: Joi.ref('childAge'),
childAgeBack1: Joi.ref('childAge', {ancestor: 2}),
})
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).with('a', 'b');
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).without('a', ['b']);
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).xor('a', 'b');
const schema = Joi.object({
mode: Joi.string().allow('email', 'phone').required(),
address: Joi.string().when('mode', { is: 'email', then: Joi.string().email() }).required()
});
const { error } = schema.validate({
name: 'chaorenya'
}).unknown() // 允许出现其他字段
// demo1
if ((!req.body.keyList || !req.body.keyList.length) && !req.body.hasFilter) {
return new req.Exception(`keyList / hasFilter ${req.ReturnMessages.INVALID}`)
}
// joi ed
const schema = Joi.object({
keyList: Joi.when('hasFilter', { is: Joi.not(true), then: Joi.array().min(1).required() }),
hasFilter: Joi.boolean()
})
// demo2
if (!['FAT', 'FWS'].includes(ENV)) {
return new req.Exception('env INVALID')
}
// joi ed
const schema = Joi.object({
env:Joi.string().valid('FAT', 'FWS').insensitive().required()
})
// 或者可以转换为大写再比较,Joi.string().uppercase().valid().required()