如何自定义Joi.array Schema的错误提示信息
问题:修改Joi校验的错误提示文本
你定义的Joi Schema和校验中间件如下:
原Joi Schema
export const orderSchema = Joi.object({ productsIds: Joi.array().items(Joi.number()).min(1).required().message, });
原校验中间件
const orderValidation = (req: Request, _res: Response, next: NextFunction) => { const { body } = req; const { error } = orderSchema.validate(body); if (error) { throw new ThrowError( error.message.includes('required') ? statusCodes.BAD_REQUEST : statusCodes.UNPROCESSABLE_ENTITY, error.message, ); } next(); }; export default orderValidation;
当前校验后得到的错误提示为 "value" must contain at least 1 items,需要修改为指定提示文本,可按以下方式实现:
解决方案
1. 修正Schema的错误提示配置
原Schema中.message写法存在语法错误,需通过Joi的.message()或.messages()方法为不同校验规则绑定自定义提示:
方式一:为单个校验规则逐个设置提示
export const orderSchema = Joi.object({ productsIds: Joi.array() // 数组元素非数字时的提示 .items(Joi.number().message('productsIds must include only numbers')) // 数组长度不足1时的提示 .min(1).message('productsIds must contain at least 1 item') // 字段缺失时的提示 .required().message('productsIds is required'), });
方式二:用.messages()统一配置所有错误场景
通过Joi的错误类型码批量设置提示,便于统一管理:
export const orderSchema = Joi.object({ productsIds: Joi.array().items(Joi.number()).min(1).required() .messages({ 'any.required': 'productsIds is required', // 字段缺失场景 'array.min': 'productsIds must contain at least 1 item', // 数组长度不足场景 'number.base': 'productsIds must include only numbers', // 数组元素非数字场景 'array.includesRequiredUnknowns': 'productsIds must include only numbers' // 数组元素不符合要求的其他场景 }) });
2. 验证中间件逻辑适配
原中间件中通过判断错误消息是否包含required来返回对应状态码的逻辑依然适用,无需修改。
内容的提问来源于stack exchange,提问作者Bruno Pelegrino Pinto
相关产品推荐
相关产品推荐

