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

Joi validation library for node: A field is required when another is not present

我的模式有大约 3 个字段,这些字段有几个条件,具体取决于谁在场:

  1. successUrl 不能在没有 ** failUrl** 的情况下出现(反之亦然)

  2. responseUrl 如果 succesUrl and/or failUrl[=37 则不能存在=]存在

  3. 在架构中,successUrlfailUrl 对必须存在,如果 responseUrl不是(反之亦然)

我设法让前 2 个条件起作用,但是当 successUrl 不存在由于某种原因被忽略,所以当没有 successUrl、failUrl 和 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');

我明明用错了,link到reference

我想我已经成功地使用 .and() 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' ]);

.or() 强制至少存在一个 URL。其中 .and() 是严格要求里面的两个或者 none 的键。 .without() 仅当其他键不在对象中时才允许一个键。