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

如何使用Joi验证对象内部的对象类型约束?

修正你的Joi对象验证规则

首先直接给结论:你当前写的校验规则不正确,而且不是简单把string换成object就能解决的——因为slots是一个对象数组,需要用Joi的数组校验结合内部对象的约束来处理。

问题分析

你的目标对象结构是:

let login = { 
  value: 0/1, // 应为0或1的数字
  slots: [
    { label: '', value: '24 hr'}, 
    { label: '', value: '24 hr'}
  ] // 对象数组
};

但你当前的schema把slots定义为Joi.string().required(),这完全不符合实际数据类型;如果换成Joi.object()也不对,因为它是数组而非单个对象。

正确的校验规则写法

你需要用Joi.array()来声明slots的数组类型,再用.items()来定义数组中每个对象的具体校验约束。同时可以给value字段加上更精确的范围限制(只允许0或1):

const schema = Joi.object().keys({
  // 验证value是0或1的必填数字
  value: Joi.number().valid(0, 1).required(),
  // 验证slots是必填的对象数组,每个元素符合指定结构
  slots: Joi.array()
    .items(
      Joi.object().keys({
        label: Joi.string().allow(''), // 允许空字符串,若不允许可去掉.allow('')
        value: Joi.string().valid('24 hr').required() // 限制value只能是'24 hr'
      })
    )
    .required()
});

关键说明

  • Joi.number().valid(0, 1):确保value只能是0或1,比单纯的Joi.number()更精确,匹配你的需求
  • Joi.array().items(...):明确slots是数组,并且每个元素必须匹配括号内的对象校验规则
  • 内部对象的label和value可以根据实际需求调整约束:比如如果label不允许为空,就删掉.allow('');如果value有其他可选值,在valid()里添加即可,比如valid('24 hr', '12 hr')

这样修改后,就能准确验证你描述的对象结构和类型约束了。

内容的提问来源于stack exchange,提问作者Swati Dixit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:42:31