数据校验工具Joi和Ajv(json schema)的对比&Joi使用中文错误提示的实现

1,239 阅读3分钟

在后端进行参数格式校验的时候会用到许多校验工具 例如:ajv(基于json schema),joi等

  • Ajv

优点:基于json schema所以ajv可以进行在多种变成语言中实现,不仅仅局限于JavaScript
缺点:因为它是跨平台的,所以它在它能做的事情上也受到了一定的限制,他的功能是有限的,但足够简单,在任何语言中实现它都不会太困难

  • Joi

优点:由于只面向JavaScript,它在JavaScript的可用性极大。它易于使用,易于扩展,并且具有JavaScript的全部功能,许多验证函数也内置了,不需要自己去手写,比较方便
缺点:因为只能用于JavaScript,所以如果要在前端和后端重用验证逻辑,则后端唯一选择的语言是nodejs

Joi使用中文错误提示的实现

joi这个工具很棒,但是许多人在使用Joi的时候会发现它默认为英语,不支持中文的错误提示,但是总不可能显示英文给用户看错误提示把,对于语言功能 官方给出的答案是:
虽然他们不维护语言功能,但是我们可以自己来配置实现语言国际化

1654831656273_C93FA03F-5E3C-45dd-A1FD-D2D84F96B5BE.png 自己确实可以配置,但是要自己重新手写所有的错误消息难免有点太麻烦了,我就在npmjs上搜索关键词joi-i18n然后看到了熟悉的zh-cn

image.png 虽然几乎下载量,但是我还是尝试着下载并按照他给的方式设置了一下,但是ts会报类型不匹配的错误

image.png 于是我看了joi和joi-messages-zh_cn的ts类型,发现官方这边有点变动,以前是通过language匹配message里的索引然后使用相应的语言文件,现在好像变了,不需要language匹配索引,直接把语言文件插入到message中即可,所以这里cnMessages中的'zh-cn'可以抛弃了,直接把'zh-cn'后面的对象展开放到message中即可

image.png 这样就成功解决了,可以看到,返回的是个中文提示了

image.png

但是这样还不够,这只是一个校验例子,如果不全局配置参数,每次校验都要带一个option很麻烦,使得所有的校验都可以享受这个option

在之前,joi做不到全局配置参数的功能,现在的版本已经支持通过joi.defaults()创建joi实例,使得每个校验都可以享受到当前实例的规则,十分银杏,看下官方文档

image.png 可以得知通过joi.defaults(),在函数中对schema进行一系列的操作,然后返回处理后的schema,我们将要在这里设置schema.option()设置属性达到全局配置的效果,话不多说直接开造,为了方便管理,我们在utils中新建一个joi用于输出处理后joi的实例

utils/joi

import OrginalJoi from 'joi'
import cnMessages from 'joi-messages-zh_cn'
const cnMessage = cnMessages['zh-cn']
const Joi = OrginalJoi.defaults(schema =>
  schema.options({
    messages: { ...cnMessage },
  })
)
export default Joi

在之后使用joi的时候,引入我们创建的joi实例就能实现每次都带上相同的配置了

image.png 大功告成,成功显示中文,这就是如何让joi实现中文提示的方法