JSON Schema
一个简单的JSON Schema 对象类型:
{ type: 'object', properties: { name: { type: 'string', format: 'email' }, age: { type: 'number' }, }, required: ['name'], }
复制
上述的 schema 表示一个类型为对象,其中有两个属性,分别为name与age,name为必选字符串类型,格式验证规则为按照邮箱格式验证,age为可选数字类型
ajv
AJV(Another JSON Schema Validator)是一个用于在JavaScript中验证数据是否符合JSON Schema规范的库。它支持快速、高效的验证,尤其在处理大规模数据时表现优异。
ajv使用:
首先安装ajv以及 ajv-formats(可选)
ajv-formats 是一个提供额外格式验证功能的库。它允许你在使用 AJV 验证 JSON Schema 时,轻松支持一些常见的格式检查,如邮箱、日期、URI等。
yarn install ajv ajv-formats pnpm install ajv ajv-formats 复制
新建一个schema-test.js,导入依赖
//导入依赖 import Ajv from "ajv" import addFormats from 'ajv-formats'
复制
在下方编写一个schema
//编写schema const schema = { type: 'object', properties: { // 要使用format,需要安装ajv-formats name: { type: 'string', format: 'email' }, age: { type: 'number' }, }, required: ['name'], }
复制
创建ajv实例
//创建一个ajv实例 const ajv = new Ajv()
复制
添加常用formats支持
//添加常用formats支持 addFormats(ajv)
复制
创建schema验证器,并输入测试用例进行验证
//编译schema const validate = ajv.compile(schema) //使用创建好的schema验证器验证一个对象 const valid = validate({ name: '1qq.com' }) //验证对象合法性,如果不合法,打印错误信息 if (!valid) console.log(validate.errors);
复制
自定义验证器(addFormat)
除了官方的format验证规则,我们自己也可以编写一个自定义的验证器:
//自定义format ajv.addFormat('test', (data) => { console.log('test', data) return data === '1qq.com' })
复制
自定义关键字
通过 ajv.addKeyword,你可以扩展 AJV 的功能,定义自己的验证规则或功能,而不仅仅依赖于标准的 JSON Schema 关键词。比如,你可以添加一个自定义的验证器,或者添加一些特定的数据处理逻辑。
//编写schema const schema = { type: 'object', properties: { // 要使用format,需要安装ajv-formats name: { type: 'string', eq6: false }, age: { type: 'number' }, }, required: ['name'], } //ajv其余逻辑... //自定义关键字 ajv.addKeyword('eq6', { validate: (schema, data) => { console.log(schema, data); if (schema === true) { return true } return data.length === 6 }, // compile(schema, parentSchema) { // //parentSchema: { type: 'string', eq6: false } // console.log(1, schema, parentSchema); // //返回一个函数 // return () => true // }, metaSchema: { //定义这个eq6的数据类型 type: 'boolean' }, macro() { //返回一个对象,这个对象会被合并到schema中 return { minLength: 6, } } }) //ajv其余逻辑...
复制
错误信息国际化
如果我们在使用ajv时候需要不同语言的错误提示,可以安装ajv-i18n
库:
pnpm i ajv-i18n yarn i ajv-i18n 复制
使用:
import localize from 'ajv-i18n' /* 代码省略... */ //验证对象合法性,如果不合法,打印错误信息 if (!valid) { //中文 localize.zh(validate.errors) console.log(validate.errors) }
复制
自定义错误信息
//导入依赖 import Ajv from "ajv" import addFormats from 'ajv-formats' import ajvErrors from 'ajv-errors' //编写schema const schema = { type: 'object', properties: { // 要使用format,需要安装ajv-formats name: { type: 'string', eq6: true, }, age: { type: 'number' }, }, required: ['name'], errorMessage: { type: '应为对象', eq6: '长度必须是6', properties: { name: 'name长度必须是6' } } } //创建一个ajv实例 const ajv = new Ajv({ allErrors: true }) //添加常用formats支持 addFormats(ajv) //添加自定义errors ajvErrors(ajv) //自定义关键字 ajv.addKeyword('eq6', { validate: (schema, data) => { console.log(schema, data); return data.length === 6 }, errors: true, }) //编译schema const validate = ajv.compile(schema) //使用创建好的schema验证器验证一个对象 const valid = validate({ name: '12345' }) //验证对象合法性,如果不合法,打印错误信息 if (!valid) { console.log(validate.errors) }
复制