在后端进行参数格式校验的时候会用到许多校验工具 例如:ajv(基于json schema),joi等
-
Ajv
优点:基于json schema所以ajv可以进行在多种变成语言中实现,不仅仅局限于JavaScript
缺点:因为它是跨平台的,所以它在它能做的事情上也受到了一定的限制,他的功能是有限的,但足够简单,在任何语言中实现它都不会太困难
-
Joi
优点:由于只面向JavaScript,它在JavaScript的可用性极大。它易于使用,易于扩展,并且具有JavaScript的全部功能,许多验证函数也内置了,不需要自己去手写,比较方便
缺点:因为只能用于JavaScript,所以如果要在前端和后端重用验证逻辑,则后端唯一选择的语言是nodejs
Joi使用中文错误提示的实现
joi这个工具很棒,但是许多人在使用Joi的时候会发现它默认为英语,不支持中文的错误提示,但是总不可能显示英文给用户看错误提示把,对于语言功能
官方给出的答案是:
虽然他们不维护语言功能,但是我们可以自己来配置实现语言国际化
自己确实可以配置,但是要自己重新手写所有的错误消息难免有点太麻烦了,我就在npmjs上搜索关键词joi-i18n然后看到了熟悉的zh-cn
虽然几乎下载量,但是我还是尝试着下载并按照他给的方式设置了一下,但是ts会报类型不匹配的错误
于是我看了joi和joi-messages-zh_cn的ts类型,发现官方这边有点变动,以前是通过language匹配message里的索引然后使用相应的语言文件,现在好像变了,不需要language匹配索引,直接把语言文件插入到message中即可,所以这里cnMessages中的
'zh-cn'可以抛弃了,直接把'zh-cn'后面的对象展开放到message中即可
这样就成功解决了,可以看到,返回的是个中文提示了
但是这样还不够,这只是一个校验例子,如果不全局配置参数,每次校验都要带一个option很麻烦,使得所有的校验都可以享受这个option
在之前,joi做不到全局配置参数的功能,现在的版本已经支持通过joi.defaults()创建joi实例,使得每个校验都可以享受到当前实例的规则,十分银杏,看下官方文档
可以得知通过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实例就能实现每次都带上相同的配置了
大功告成,成功显示中文,这就是如何让joi实现中文提示的方法