当前位置: 首页 > news >正文

joi:定义多个自定义错误信息

目录

前言

原始版

基础错误版

复杂版

简单版


前言

在项目中,提交表单进行字段验证是必不可少的,在node项目中,自己写if else判断非常的繁琐,也不好进行维护,所以我们通常都会引入第三方包joi,来帮助我们进行表单字段的验证。

原始版

于是我写下了以下代码:

const username = joi.string().alphanum().min(1).max(10).required()

当然,验证是通过的,没有问题的,

username是一个字符串,值只能包含 a-zA-Z0-9,最小长度1,最大长度10,必填项。

利用postman发送请求,先看看会返回什么。

长度大于10的时候返回:

包含特殊字符的时候返回:

等等,还有很多,但都是返回的英文,虽然能读懂是什么含义,但是对于用户来讲,用户看不懂,于是要求返回中文

基础错误版

于是我又写了以下代码:

const username = joi.string().alphanum().min(1).max(10).required().error(new Error('用户名格式错误'))

postman请求一哈

然后吧,就发现任何错误的格式,返回的错误都是用户名格式错误,包括username为空,username参数不存在,username长度超出10等等 ,用户压根不知道自己犯了什么错。。。这种错误提示信息看来还是不行

复杂版

于是我又又写下了如下代码

const username = joi.string().alphanum().min(1).max(10).required().error(
    errors => {
        console.log(errors)
        for (err of errors) {
            console.log(err.code)
            switch (err.code) {
                case 'string.alphanum':
                    return new Error('只能包含a-zA-Z0-9')
                case 'string.max':
                    return new Error('用户名长度不能超过10')
                case 'string.empty':
                case 'any.required':
                    return new Error('用户名必填')
                default:
                    return new Error('用户名格式错误')
            }
        }
    }
)

 errors:

[
  {
    code: 'string.alphanum',
    flags: { presence: 'required', error: [Function (anonymous)] },
    messages: {
      'any.custom': [Object],
      'any.default': [Object],
      'any.failover': [Object],
      'any.invalid': [Object],
      'any.only': [Object],
      'any.ref': [Object],
      'any.required': [Object],
      'any.unknown': [Object],
      'string.alphanum': [Object],
      'string.base': [Object],
      'string.base64': [Object],
      'string.creditCard': [Object],
      'string.dataUri': [Object],
      'string.domain': [Object],
      'string.email': [Object],
      'string.empty': [Object],
      'string.guid': [Object],
      'string.hex': [Object],
      'string.hexAlign': [Object],
      'string.hostname': [Object],
      'string.ip': [Object],
      'string.ipVersion': [Object],
      'string.isoDate': [Object],
      'string.isoDuration': [Object],
      'string.length': [Object],
      'string.lowercase': [Object],
      'string.max': [Object],
      'string.min': [Object],
      'string.normalize': [Object],
      'string.token': [Object],
      'string.pattern.base': [Object],
      'string.pattern.name': [Object],
      'string.pattern.invert.base': [Object],
      'string.pattern.invert.name': [Object],
      'string.trim': [Object],
      'string.uri': [Object],
      'string.uriCustomScheme': [Object],
      'string.uriRelativeOnly': [Object],
      'string.uppercase': [Object]
    },
    path: [ 'username' ],
    prefs: {
      abortEarly: true,
      allowUnknown: true,
      artifacts: false,
      cache: true,
      context: null,
      convert: true,
      dateFormat: 'iso',
      errors: [Object],
      externals: true,
      messages: {},
      nonEnumerables: false,
      noDefaults: false,
      presence: 'optional',
      skipFunctions: false,
      stripUnknown: true,
      warnings: false
    },
    state: {
      path: [Array],
      ancestors: [Array],
      mainstay: [Object],
      schemas: null,
      debug: null
    },
    value: '%qwe',
    message: null,
    template: null,
    local: { label: 'username', value: '%qwe', key: 'username' }
  }
]

随后再用postman进行测试的时候,感觉这提示也太人性化了吧 0.0

 

简单版

后来经过查阅资料得知,还可以简单点

于是我又又又写下了如下代码:

const username = joi.string().alphanum().min(1).max(10).required().messages({
    "string.empty": "用户名必填",
    "any.required": "用户名必填",
    "string.alphanum": '只能包含a-zA-Z0-9',
    "string.max": '用户名长度不能超过10',
})

 经过测试,和error的模式是一样的,还挺不错!

相关文章:

  • 限流相关算法
  • java计算机毕业设计阳明湖风景区订票系统源码+数据库+系统+lw文档+mybatis+运行部署
  • Java 中所有的锁
  • 【基于Arduino的垃圾分类装置开发教程二传感器执行器操作】
  • java中static关键字具有什么功能呢?
  • springcloud 之gateway配置注意事项
  • JS BOM
  • 领英工具-领英精灵群发消息功能解析
  • [答疑]微信餐馆案例中,“启动二维码对应的程序”这个用例合理吗
  • Defocus(散焦)
  • jvm中对象内存空间的分配与回收
  • Shiro 550、721
  • Mybatis开启日志
  • linux中查看MySQL数据库表数据及结构并导入sql脚本
  • Maven dependency 详解
  • 分享的文章《人生如棋》
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • CODING 缺陷管理功能正式开始公测
  • happypack两次报错的问题
  • Laravel核心解读--Facades
  • linux安装openssl、swoole等扩展的具体步骤
  • Making An Indicator With Pure CSS
  • MySQL数据库运维之数据恢复
  • quasar-framework cnodejs社区
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Swift 中的尾递归和蹦床
  • text-decoration与color属性
  • Vue ES6 Jade Scss Webpack Gulp
  • 关于List、List?、ListObject的区别
  • 开源地图数据可视化库——mapnik
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 设计模式(12)迭代器模式(讲解+应用)
  • ionic异常记录
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #控制台大学课堂点名问题_课堂随机点名
  • (1)(1.13) SiK无线电高级配置(六)
  • (初研) Sentence-embedding fine-tune notebook
  • (分享)自己整理的一些简单awk实用语句
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)mysql_MYSQL(三)
  • (三)uboot源码分析
  • (十三)Flask之特殊装饰器详解
  • (转)mysql使用Navicat 导出和导入数据库
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .net Signalr 使用笔记
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .so文件(linux系统)
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [ IOS ] iOS-控制器View的创建和生命周期