如何复用现有Joi Schema属性且排除xor约束与消息配置?
解决Joi Schema提取属性并扩展的问题
要实现只提取baseSchema里的属性规则、排除原有的xor约束和自定义消息,再扩展新属性后重新设置规则,你可以用Joi的describe()方法获取原始属性的规则描述,再基于描述重建基础Schema。
具体实现步骤
- 提取属性规则描述:通过
baseSchema.describe()拿到Schema的结构化元数据,其中keys字段就是所有属性的规则定义。 - 重建无约束基础Schema:用
Joi.object()传入提取到的keys,得到仅包含属性规则、不带原顶级约束和消息的Schema。 - 扩展属性并设置新规则:在重建的基础Schema上添加新属性
c,再重新配置xor和自定义消息。
完整代码示例
const baseSchema = Joi.object({ a: Joi.string().trim().empty(null, ''), b: Joi.string().guid().empty(null), }) .xor('a', 'b') .messages({ 'object.missing': 'One of "a", "b" is required.', 'object.xor': 'Only one of "a", "b" is allowed.', }); // 提取baseSchema的属性规则描述 const basePropertyDescriptions = baseSchema.describe().keys; // 重建仅包含属性的基础Schema const plainBaseSchema = Joi.object(basePropertyDescriptions); // 扩展新属性并设置新的xor和消息 const extendedSchema = plainBaseSchema.append({ c: Joi.string().trim() }) .xor('a', 'b', 'c') .messages({ 'object.missing': 'One of "a", "b", "c" is required.', 'object.xor': 'Only one of "a", "b", "c" is allowed.', });
方法说明
describe()方法会返回Joi Schema的完整结构化描述,其中的keys仅包含各个属性自身的验证规则,不会携带Schema的顶级约束(如xor)和自定义消息。用这个描述重建的Schema完全符合“仅保留属性”的需求,后续添加新属性和约束时不会受原Schema的影响。
内容的提问来源于stack exchange,提问作者MaterialZ
相关产品推荐
相关产品推荐

