古之立大事者,不惟有超世之才,亦必有坚忍不拔之志——苏轼
写在前面
我们在用 Node.js 的时候经常会用到数据校验,在做数据校验的时候通常采用的方式是正则表达式,虽然正则表达式可以很严谨的帮助我们做校验,但是正则表达式的返回值通常只有 true
or false
,而且书写正则表达式又是特别费时费力的工作。于是 Joi
模块就出现了。它可以帮助我们解决数据校验的问题。
Joi
Joi 是 JavaScript 对象的规则描述语言和验证器,可以帮助我们简单、直观和可读的方式来描述数据。
Joi 的安装
这里使用的是 Joi 14.3.1
命令命令如下所示:
npm install joi@14.3.1
用法
Joi 的用法一般分为三个步骤
-
引入 Joi 模块
// 引入 Joi 模块 const Joi = require('joi')
-
使用提供的类型和约束模式构建一个 Joi 约束模式对象。示例代码如下所示:
// 定义验证规则 const schema = { // 约束username的类型为字符串类型。 // Joi.string() 的返回值又是一个 Joi 对象,所以可以链式调用这个对象 username: Joi.string().min(2).max(20) // 表示username为字符串类型最小长度为2最大长度为20 }
-
通过
validate()
方法进行验证,语法结构如下所示:validate(value, schema)
参数说明:
value
: 表示要验证的值schema
: 表示验证架构
该方法是一个异步方法,如果校验成功则返回值为当前数据内容,否则返回一个
ValidationError
对象示例代码如下所示:
async function run() { try { // 实施验证 let test = await Joi.validate({ username: 'sweet' }, schema) console.log(test); } catch (e) { console.log(e); return; } } run()
调用
Joi.validate()
方法进行数据校验,如果验证成功则返回其数据内容,验证失败则进入catch
语句。
这就是 Joi 模块的基本用法。
验证规则
对一个字段的基本验证规则是:类型 / 长度范围 / 取值范围 / 是否必填 / 与其它字段的关系 / 默认值 / 错误处理
Joi 中的类型
在 Joi 中 any()
表示任意类型,指定类型如下表所示:
方法 | 描述 |
---|---|
array() | 数组类型 |
boolean() | 布尔类型 |
binary() | 缓冲区数据类型 |
func() | 函数类型 |
number() | 数字类型 |
object() | 对象类型 |
string() | 字符串类型 |
长度范围
规定长度范围的验证规则是 max()
和 min()
。如果在数组中,这个长度就表示数组的长度,字符串中则表示字符串中的长度,数字则表示数字的大小。
示例代码如下所示:
const s = {
// 数组的最小长度为2, 最大长度为10
arr: Joi.array().min(2).max(10),
// 字符串的最小长度为2, 最大长度为10
str: Joi.string().min(2).max(10),
// 数字值的最小值是10,最大值是100
num: Joi.number().min(10).max(100)
}
取值范围
规则取值范围的是 valid()
表示必须在这个取值范围内,而 invaild()
则表示不能在这个取值范围内。示例代码如下所示:
const s = {
// 必须是数字1或者数字2否则抛出异常
num1: Joi.any().valid(1, 2),
// 不能是数字1或者数字2,否则抛出异常
num2: Joi.any().invalid(1, 2)
}
是否必填
required()
方法表示此选项为必填项。示例代码如下所示:
const schema = Joi.any().required();
与其它字段的关系
when()
用于灵活的转变类型,语法结构如下所示:
any.when(condition, options)
参数说明
condition
: 表示键名称options
具有三个参数is
: 所需的条件joi
类型。then
: 如果条件为true
,则为备用架构类型。otherwise
: 如果条件为false
,则为备用架构类型。
示例代码如下所示:
// 引入 Joi 模块
const Joi = require('joi')
// 定义验证规则
const s = {
// 如果传入的数据 是 数字, 大,则数字必须是50-100,如果是 数字 小则数字必须是 0-50 之间
num: Joi.number().min(0).max(100).when('size', {
is: '大',
then: Joi.number().min(50).max(100),
otherwise: Joi.number().min(0).max(50)
}),
size: Joi.any().valid('大', '小')
}
async function run() {
try {
// 实施验证
let test = await Joi.validate({
num: 80,
size: '大'
}, s)
console.log(test);
} catch (e) {
console.log(e);
return;
}
}
run()
执行结构如下所示:
{ num: 80, size: '大' }
如果将大改为小则会抛出异常。
默认值
在 Joi 中定义默认值使用 default()
,如果我们的数据中存在 undefined
则校验之后会变成我们设置的默认值,这个值仅仅对 undefined
有效,对 null
并没有效果。
校对规则如下所示:
async function run() {
try {
// 实施验证
let test = await Joi.validate(undefined, Joi.string().default("没有值"))
console.log(test);
} catch (e) {
console.log(e);
return;
}
}
run()
执行结果为 :没有值
错误处理
我们可以通过 error(err)
方法来自定义一个错误来覆盖 Joi 的错误。
示例代码如下所示:
async function run() {
try {
// 实施验证
let test = await Joi.validate(null, Joi.string().default("没有值").error(new Error('传入的值为 null ')))
console.log(test);
} catch (e) {
console.log(e.message);
return;
}
}
run()
执行结果为 传入的值为 null
写在最后
如果文章对您有帮助,帮帮三连。蟹蟹啦~
大哥们点点关注不迷路