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

Joi配置咨询:如何让嵌套对象可选但存在时内部字段必填?

问题描述

现有如下Joi校验 Schema:

export const OrganizationUpdateSchema = Joi.object({
  uid: Joi.string().trim().required(),
  organizationDetails: Joi.object({
    email: Joi.string().email().trim(),
    organizationName: Joi.string().trim(),
    headquarter: Joi.object({
      id: Joi.string().trim(),
      name: Joi.string().trim(),
      address: Joi.string().trim(),
      state: Joi.string().trim(),
      street: Joi.string().trim(),
      pincode: Joi.string().trim().length(6),
    })
  })
})

需求:

  • 将headquarter设置为可选字段
  • 若请求体中传入headquarter对象,其内部的id、name、address、state、street和pincode字段必须全部设为必填项

疑惑:由于headquarter是可选字段,当未传入该对象时,Joi是否会因嵌套字段未被使用而抛出错误?

解决方案

修改后的Schema

export const OrganizationUpdateSchema = Joi.object({
  uid: Joi.string().trim().required(),
  organizationDetails: Joi.object({
    email: Joi.string().email().trim(),
    organizationName: Joi.string().trim(),
    // 核心修改:headquarter设为可选,同时内部字段全部设为必填
    headquarter: Joi.object({
      id: Joi.string().trim().required(),
      name: Joi.string().trim().required(),
      address: Joi.string().trim().required(),
      state: Joi.string().trim().required(),
      street: Joi.string().trim().required(),
      pincode: Joi.string().trim().length(6).required(),
    }).optional()
  })
})

逻辑说明

  1. 可选字段设置:通过.optional()标记headquarter为可选字段,允许请求体中不包含该字段。
  2. 内部字段必填:给headquarter对象内的每个字段添加.required(),确保只要headquarter存在,所有内部字段都必须提供且符合规则。

疑惑解答

不会抛出错误。Joi的校验逻辑是仅对存在的字段进行校验:当请求体中没有传入headquarter时,Joi会直接跳过该字段的所有嵌套校验规则,不会因为嵌套字段未被使用而触发错误。只有当headquarter出现在请求体中时,才会校验其内部的必填字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:17:51