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() }) })
逻辑说明
- 可选字段设置:通过
.optional()标记headquarter为可选字段,允许请求体中不包含该字段。 - 内部字段必填:给
headquarter对象内的每个字段添加.required(),确保只要headquarter存在,所有内部字段都必须提供且符合规则。
疑惑解答
不会抛出错误。Joi的校验逻辑是仅对存在的字段进行校验:当请求体中没有传入headquarter时,Joi会直接跳过该字段的所有嵌套校验规则,不会因为嵌套字段未被使用而触发错误。只有当headquarter出现在请求体中时,才会校验其内部的必填字段。
内容的提问来源于stack exchange,提问作者Worldwide
相关产品推荐
相关产品推荐

