节点的Join验证库:当不存在另一个字段时,需要一个字段



我的模式有大约3个字段,根据在场人员的不同,它们有几个条件:

  1. successUrl在没有**failUrl**的情况下不可能存在(反之亦然(

  2. 如果存在successUrl和/或failUrl,则responseUrl

  3. 在架构中,如果responseUrl不存在(反之亦然(,则successUrlfailUrl

我设法使前两个条件发挥作用,但;当";由于某种原因,当successUrl不存在时,本应使responseUrl

const schema = Joi.object().keys({
transaction: Joi.string().max(60),
partner: Joi.string().regex(/^[0-9a-fA-F]{24}$/, 'Invalid partner ID').required(),
amount: Joi.number().min(1).required(),
responseUrl: Joi.string().uri().when('successUrl', { is: !Joi.exist(), then: Joi.string().uri().required() }),
successUrl: Joi.string().uri(),
failUrl: Joi.string().uri()
}).with('successUrl', 'failUrl').with('failUrl', 'successUrl').without('responseUrl', 'successUrl').without('responseUrl', 'failUrl');

我显然用错了,链接到参考。

我想我只使用了.and().without()就修复了您的模式。

您的模式的以下简化版本有效:

const schema = Joi.object().keys({
failUrl: Joi.string(),
responseUrl: Joi.string(),
successUrl: Joi.string()
})
.or('failUrl', 'responseUrl', 'successUrl')
.and('successUrl', 'failUrl')
.without('responseUrl', [ 'successUrl', 'failUrl' ]);

CCD_ 3强制存在至少一个URL。.and()将严格要求里面的两个密钥或不需要任何密钥。.without()只允许在其他键不在对象中时使用一个键。

最新更新