用Joi守住数据防线!Node.js/前端必备校验神器入门与进阶

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: 'alice@example.com'
};

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 技术干货!如果觉得有用,记得收藏本文!

相关推荐
旧曲重听111 分钟前
最快实现的前端灰度方案
前端·程序人生·状态模式
默默coding的程序猿20 分钟前
3.前端和后端参数不一致,后端接不到数据的解决方案
java·前端·spring·ssm·springboot·idea·springcloud
夏梦春蝉26 分钟前
ES6从入门到精通:常用知识点
前端·javascript·es6
归于尽32 分钟前
useEffect玩转React Hooks生命周期
前端·react.js
G等你下课34 分钟前
React useEffect 详解与运用
前端·react.js
我想说一句35 分钟前
当饼干遇上代码:一场HTTP与Cookie的奇幻漂流 🍪🌊
前端·javascript
funnycoffee12335 分钟前
Huawei 6730 Switch software upgrade example版本升级
java·前端·华为
小鱼小鱼干38 分钟前
【Tauri】Tauri中Channel的使用
前端
拾光拾趣录40 分钟前
CSS全面指南:从基础布局到高级技巧与实践
前端·css
南屿im43 分钟前
基于 Promise 封装 Ajax 请求:从 XMLHttpRequest 到现代化异步处理
前端·javascript