如何基于各种条件使用嵌套的Joi模式

问题描述

我已经研究这个特定问题大约一个星期了,但是似乎找不到关于最新版本的JOI(17.3.0)的可靠文档。

我要实现的逻辑如下:

如果填充了A,则需要B或C。

如果填充F,则需要A ANDK。 (如果A为空,则必须为F)

我一直在浏览Joi文档,并尝试了所提供功能的各种组合。这是我当前正在运行的代码,根据所描述的逻辑,它并不能满足我的需求。

const B = Joi.alternatives().conditional(Joi.ref('#B'),{is: Joi.boolean().valid(false),then : C.required(),otherwise: Joi.date().iso()}).allow("")


 const check = Joi.object().keys({
 
  //Name search
  A: A,B: B.when('A',{is: A.required(),then: B.required()}),C: C,F: F.when('A',{is: '',then: F.required()}),K: K.when('F',{is: F.required(),then: K.required()}),A: A.when('F',then: A.required()}),}).unkNown(true);

我知道,这最像是基于架构的松散构造,因此,我正在尝试查看是否有一种方法可以创建可基于AND和OR语句等条件进行切换的嵌套架构。我见过其他人将“ when”函数连接起来以构建自定义OR(甚至AND)条件,但不确定是否有使用Joi 17.3.0的更简洁的方法

主要问题是我需要基于条件引导模式,而不是仅仅将信息扔到正文中以希望它能正常工作。我没有任何语法错误,但是在发送请求时,我没有得到所需的正确响应/错误

理想情况下,我想拥有它,以便它可以检查何时给出A,B或C或是否给出F AND K AND A,然后根据给出的内容使用正确的架构。 / p>

除此之外,我所有的引用都带有一个“ .allow(”“)”,这样当没有内容分配给不需要的引用时,架构不会抛出错误。在了解any.optional()函数之前,我先进行了此操作。不确定是否可能是问题,只是不确定其他信息,以防万一。

任何建议都会有所帮助。

解决方法

我正在使用@hapi/joi

joi.alternatives(
    joi.object({
        A: joi.string().required(),B: joi.string().required(),C: joi.string().allow(''),}),joi.object({
        A: joi.string().required(),B: joi.string().allow(''),C: joi.string().required(),joi.object({
        F: joi.string().required(),A: joi.string().required(),K: joi.string().required(),})
)

随时添加更多替代方案。