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

相关推荐
江上月5132 分钟前
JMeter中级指南:从数据提取到断言校验全流程掌握
java·前端·数据库
代码猎人4 分钟前
forEach和map方法有哪些区别
前端
恋猫de小郭5 分钟前
Google DeepMind :RAG 已死,无限上下文是伪命题?RLM 如何用“代码思维”终结 AI 的记忆焦虑
前端·flutter·ai编程
byzh_rc13 分钟前
[微机原理与系统设计-从入门到入土] 微型计算机基础
开发语言·javascript·ecmascript
m0_4711996313 分钟前
【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式
前端·vue.js·小程序
编程大师哥14 分钟前
Java web
java·开发语言·前端
A小码哥15 分钟前
Vibe Coding 提示词优化的四个实战策略
前端
Murrays16 分钟前
【React】01 初识 React
前端·javascript·react.js
大喜xi19 分钟前
ReactNative 使用百分比宽度时,aspectRatio 在某些情况下无法正确推断出高度,导致图片高度为 0,从而无法显示
前端
helloCat19 分钟前
你的前端代码应该怎么写
前端·javascript·架构