【Joi】数据验证库

920 阅读2分钟

前言

Joi是一个强大的数据验证库,常用于校验 JSON 数据是否符合预期的结构和格式。

因为这个库非常符合人类的直觉,所以直接上代码就完事了,这边不多介绍了,你包能看得懂的。

快速入门 Joi 示例代码

示例 1:校验名字和年龄

const Joi = require('joi');

// 定义数据结构
const userSchema = Joi.object({
    name: Joi.string().alphanum().min(3).max(30).required(), // 名字必须是字母或数字,长度在3到30之间
    age: Joi.number().integer().min(0).max(120).required() // 年龄必须是整数,范围在0到120之间
}).options({
    abortEarly: false, // 返回所有错误,而不是第一个错误
    allowUnknown: false // 不允许未知字段
});

// 测试数据
const userData = {
    name: 'jjq',
    age: 23
};

// 校验数据
const { error } = userSchema.validate(userData);

if (error) {
    console.error('校验失败:', error.details);
} else {
    console.log('校验成功:', userData);
}

示例 2:校验邮箱和电话号码

const Joi = require('joi');

// 定义数据结构
const contactSchema = Joi.object({
    email: Joi.string().email().required(), // 邮箱必须是有效的邮箱格式
    phone: Joi.string().length(11).pattern(new RegExp(/^1[3-9]\d{9}$/)).required() // 电话号码必须是11位,且符合中国大陆手机号格式
}).options({
    abortEarly: false,// 返回全部的错误
    allowUnknown: false// 不允许未知字段
});

// 测试数据
const contactData = {
    email: 'jjq@example.com',
    phone: '666888'
};

// 校验数据
const { error } = contactSchema.validate(contactData);

if (error) {
    console.error('校验失败:', error.details);
} else {
    console.log('校验成功:', contactData);
}

示例 3:校验自定义规则(如用户名和密码)

const Joi = require('joi');

// 定义数据结构
const authSchema = Joi.object({
    username: Joi.string().alphanum().min(5).max(20).required(), // 用户名必须是字母或数字,长度在5到20之间
    password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{6,20}$')).required() // 密码必须是字母或数字,长度在6到20之间
}).options({
    abortEarly: false,
    allowUnknown: false
});

// 测试数据
const authData = {
    username: 'jjqdemo',
    password: 'pwdpwdpwd'
};

// 校验数据
const { error } = authSchema.validate(authData);

if (error) {
    console.error('校验失败:', error.details);
} else {
    console.log('校验成功:', authData);
}

示例 4:校验数组和嵌套对象

const Joi = require('joi');

// 定义数据结构
const complexSchema = Joi.object({
    name: Joi.string().required(),
    age: Joi.number().integer().min(0).max(120).required(),
    hobbies: Joi.array().items(Joi.string().required()), // 爱好必须是字符串数组
    address: Joi.object({
        city: Joi.string().required(),
        zipCode: Joi.string().length(6).required() // 邮编必须是6位
    }).required()
}).options({
    abortEarly: false,
    allowUnknown: false
});

// 测试数据
const complexData = {
    name: 'jjq',
    age: 23,
    hobbies: ['唱', '跳', 'rap'],
    address: {
        city: '深圳',
        zipCode: '666666'
    }
};

// 校验数据
const { error } = complexSchema.validate(complexData);

if (error) {
    console.error('校验失败:', error.details);
} else {
    console.log('校验成功:', complexData);
}

总结

重点记住下面几个操作

  1. 创建schema:
const schema = Joi.object({
    name: Joi.string()
})
  1. 校验:
let obj = {"name":"jjq"}
let { error } = schema.validate(obj)
if (error) {
    // 校验失败
} else {
    // 校验成功
}

主要就是这两个内容

下次见!🫏