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

如何配置Joi Schema:id需搭配type,and嵌套场景除外

调整Joi Schema实现仅根级id需关联type的校验规则

需求回顾

原Schema规则要求只要传入id就必须同时传入type,现在需要修改为:仅当id未嵌套在and字段下时,才要求id与type同时存在;嵌套在and数组内的对象可以单独传id。

解决方案

通过拆分基础Schema和根级Schema的方式实现需求:将嵌套结构(and/or)引用的Schema与根级Schema分离,仅在根级Schema中添加id和type的关联校验。

修改后的完整代码:

// 定义基础Schema,包含所有字段但不添加id与type的关联规则
const baseSchema = joi.object().keys({
    id: joi.string(),
    type: joi.string(),
    expirationTime: dateSchema,
    createdBy: joi.string().uuid(),
    createdAt: dateSchema,
    // or数组引用基础Schema
    or: joi.array().items(joi.link('#baseSchema')).min(2),
    // and数组引用基础Schema
    and: joi.array().items(joi.link('#baseSchema')).min(2)
}).label('baseSchema'); // 给基础Schema打标签,用于link引用

// 根级Schema:基于基础Schema,添加必填要求和id与type的关联规则
const rootSchema = baseSchema
    .required()
    .with('id', 'type'); // 仅根级生效:传id必须同时传type

规则说明

  1. 基础Schema:包含所有字段定义,以及and/or的递归引用,但不设置id与type的关联校验,因此嵌套在and/or内的对象可以单独传id。
  2. 根级Schema:在基础Schema之上,添加.with('id', 'type')规则,确保根级的id必须与type同时存在。

示例验证

  • 示例1(根级仅传id):

    {
      "id": "foo"
    }
    

    校验失败,符合预期(根级id未搭配type)。

  • 示例2(根级传id+type,and内仅传id):

    {
      "id": "foo",
      "type": "bar",
      "and": [{ "id": "foobar" }, { "createdBy": "me" }]
    }
    

    校验通过,符合预期(and内的id无需搭配type)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:45:42