Joi 17.4.2校验错误信息携带异常字符,如何获取纯文本报错内容?
问题原因
你遇到的乱码字符是Joi 17版本默认开启的终端彩色输出专用ANSI转义码,error.message默认返回的是适配终端打印的带格式内容,不适合直接展示给普通用户。
解决方法
可按优先级选择以下方案:
方案1:直接从错误详情提取纯文本(最稳妥,无需修改校验逻辑)
Joi的校验错误对象内置了结构化的details数组,每个元素的message字段就是无额外格式的纯文本错误描述,直接修改错误处理逻辑即可:
if (isValidationError(error)) { // 仅取第一条错误,需要展示多条错误可自行用符号拼接数组内容 const pureErrorMessage = error.details[0].message // 多条错误拼接写法:const pureErrorMessage = error.details.map(item => item.message).join(';') return new BadRequestError(pureErrorMessage) }
执行后即可直接得到你预期的"username" is required输出。
方案2:关闭Joi彩色输出配置
如果要保留使用error.message的原有逻辑,可以关闭Joi的颜色格式化开关:
- 单校验生效:调用
validate方法时传入配置
const validationResult = workGroupValidationSchema.validate(待校验数据, { errors: { color: false } })
- 全局生效:统一配置Joi默认参数
import Joi from 'joi' const PureTextJoi = Joi.defaults(schema => schema.options({ errors: { color: false } })) // 后续所有校验schema都用PureTextJoi定义即可 export const workGroupValidationSchema = PureTextJoi.object({ username: Joi.string().required(), password: Joi.string().required(), })
内容的提问来源于stack exchange,提问作者Or Yaacov
相关产品推荐
相关产品推荐

