如何配置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
规则说明
- 基础Schema:包含所有字段定义,以及
and/or的递归引用,但不设置id与type的关联校验,因此嵌套在and/or内的对象可以单独传id。 - 根级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
相关产品推荐
相关产品推荐

