You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:25:18