error-handling - 如何在 joi 中为正则表达式设置自定义消息
问题描述
当我验证我的 graphql 参数时,我在密码字段中收到这样的错误消息。
"password" with value "" fails to match the required pattern: /^(?=\\S*[a-z])(?=\\S*[A-Z])(?=\\S*\\d)(?=\\S*[^\\w\\s])\\S{8,30}$/"
我不想在错误消息中显示正则表达式模式。所以我尝试为密码字段设置自定义错误消息,但它仍然显示正则表达式模式。
import Joi from "joi";
export default Joi.object().keys({
email: Joi.string().email().required().label("Email"),
username: Joi.string().alphanum().min(4).max(20).required().label("Username"),
name: Joi.string().min(4).max(256).required().label("Name"),
password: Joi.string()
.min(8)
.regex(/^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*[^\w\s])\S{8,30}$/)
.required()
.label("Password")
.messages({
"string.min": "Must have at least 8 characters",
"object.regex": "Must have at least 8 characters",
}),
});
我认为它不是通过选择正则表达式object.regex
。请帮忙。
解决方案
要知道抛出了什么错误,您可以调试错误对象(通过记录它),然后找到type
错误。
例子:
const Joi = require('@hapi/joi');
const joiSchema = Joi.object().keys({
password: Joi.string()
.min(8)
.regex(/^(?=\S*[a-z])(?=\S*[A-Z])(?=\S*\d)(?=\S*[^\w\s])\S{8,30}$/)
.required()
.label("Password")
.messages({
"string.min": "Must have at least 8 characters",
"object.regex": "Must have at least 8 characters",
"string.pattern.base": "enter your custom error here..."
})
});
const validationResult = joiSchema.validate({ password: "2" }, { abortEarly: false });
console.log(validationResult.error.details.map(errDetail => errDetail.type), validationResult.error);
这输出["string.min", "string.pattern.base"]
. details
由于 string.min 和 string.pattern.base 有 2 个错误,并abortEarly
设置为 false。
推荐阅读
- xslt - 基于相同的子值 (ID) 合并两个不同的父节点内容 - XSL 转换
- c# - CEF Sharp - C# WPF 发布的项目将无法运行 - 引发错误 - 错误模块名称:KERNELBASE.dll,版本:10.0.18362.1316,
- python - discord.py 中的播放函数抛出错误
- mysql - 在基数中,笔画表示的最大关系数是多少?(MySQL)
- javascript - 使用 CSS 网格构建反应基础布局的最佳方法
- python - 使用迭代方法从 Python 中的起始节点到达图中的目标节点
- sql - 在 Postgres 中结合日期和 UTC 时间字段
- javascript - Onclick复选框如何更改按钮颜色?
- uml - 如何在不结束活动过程的情况下使用 UML 在活动图中对错误消息进行建模
- c# - 等于覆盖和 LINQ GroupBy