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

相关推荐
半个落月3 分钟前
用 LangChain.js 手写一个能读写文件和执行命令的 Mini Cursor
javascript·人工智能·后端
天外天-亮18 分钟前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
huashengzsj24 分钟前
Shopify个人建站如何搭建独立站:从零开始的完整指南
前端·网络·人工智能
程序猿小泓35 分钟前
从 Claude Code 学 Agent Harness:一个前端工程师的 AI Agent 学习笔记
前端·人工智能·学习
柒和远方1 小时前
从审计日志到可下载证据包:事务型 Outbox、租约 fencing 与保留水位
前端·后端·架构
minglie12 小时前
npm ali-oss库依赖冲突
前端·npm
CryptoPP2 小时前
BSE股票K线数据接入实战:从接口调用到前端图表展示
大数据·前端·网络·人工智能·websocket·网络协议
Random_index4 小时前
#Vue3篇: Vue 项目发版后如何提示用户刷新?基于 package.json 版本号的前端更新检测方案
前端·vue.js·json
没落英雄4 小时前
5. 从零开始搭建一个 AI Agent —— 人机协作与中断恢复
前端·人工智能·架构
品尚公益团队4 小时前
C#在asp.net网页开发中的带cookie登录实现
前端·c#·asp.net