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

如何复用现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:33:22