LOADING

MiniKano的小窝


 

使用AJV配合JSON Schema实现数据校验

JSON Schema

JSON Schema 文档-apifox

一个简单的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)
}
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注