Joi 是什么?
Joi 是一个为 JavaScript 提供强大数据校验和数据结构描述能力的库。在 Node.js、前端都广受欢迎,常用于接口参数校验、表单验证等场景。本文带你逐步掌握 Joi 的用法!
1. 安装 Joi
bash
npm install joi
2. Joi 的基本校验
Joi 最大的特点是声明式地描述数据结构,再去校验数据。它提供了一系列类型方法。
2.1 校验字符串
js
const Joi = require('joi');
// 定义一个字符串3-10个字符校验规则
const schema = Joi.string().min(3).max(10).required();
// 数据校验
const result = schema.validate('abc');
console.log(result); // { value: 'abc' }
2.2 校验数字
js
// 定义一个数据0-100
const schema = Joi.number().integer().min(0).max(100);
console.log(schema.validate(50)); // 合法
console.log(schema.validate(-10)); // 错误
3. 对象的校验
js
const userSchema = Joi.object({
username: Joi.string().alphanum().min(3).max(20).required(),
age: Joi.number().integer().min(0).max(120),
email: Joi.string().email()
});
const data = {
username: 'alice',
age: 25,
email: '[email protected]'
};
const { error, value } = userSchema.validate(data);
if (error) {
console.log('数据校验失败:', error.details);
} else {
console.log('校验成功', value);
}
4. 复杂场景的深度校验
Joi 支持数组、嵌套对象、枚举等更复杂的结构。
4.1 校验数组
js
const schema = Joi.array().items(Joi.string().min(2));
console.log(schema.validate(['ab', 'cd'])); // 合法
4.2 嵌套对象
js
const schema = Joi.object({
first: Joi.object({
name: Joi.string().required(),
scond: Joi.object({
phone: Joi.string().pattern(/^\d{11}$/)
})
})
});
console.log(schema.validate({
first: {
name: 'John',
scond: {
phone: '12345678901'
}
}
})); // 合法
4.3 联合类型、枚举
js
const schema = Joi.string().valid('male', 'female', 'other');
schema.validate('male'); // 合法
schema.validate('robot'); // 错误
5. 高级用法:自定义校验、条件校验
5.1 条件校验
js
const schema = Joi.object({
type: Joi.string().valid('A', 'B'),
value: Joi.when('type', {
is: 'A', then: Joi.number().required(),
otherwise: Joi.string().required()
})
});
console.log(schema.validate({ type: 'B', value: 123 })); // "value" must be a string
5.2 自定义校验
js
const schema = Joi.string().custom((value, helpers) => {
if (value !== value.split('').reverse().join('')) {
return helpers.error('any.invalid');
}
return value;
}, 'Palindrome validation');
schema.validate('abcba'); // OK
schema.validate('abc'); // Error
6. 实践小结:如何在项目中应用 Joi
- 后端接口参数校验:如在 Express.js、Koa.js 的接口中校验 req.body、req.query 的数据。
- 前端表单校验:如配合表单库,实现前端复杂校验。
- 统一错误处理:Joi 校验失败会返回详细的错误信息,可以统一封装友好的提示。
点个赞,关注我获取更多实用 JavaScript 技术干货!如果觉得有用,记得收藏本文!