【问题标题】:Joi validation library for node: A field is required when another is not present节点的 Joi 验证库:当另一个字段不存在时需要一个字段
【发布时间】:2020-09-16 21:46:55
【问题描述】:

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

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

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

    responseUrl 不能存在

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

我设法使前两个条件起作用,但是当 successUrl 不存在时,应该使 responseUrl 所需的“when”方法被某些人忽略原因,所以当没有违反我的第三个条件的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');

我明显用错了,链接到reference

【问题讨论】:

    标签: node.js joi


    【解决方案1】:

    我想我已经设法仅使用 .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() 是严格要求里面的两个或一个键。 .without() 是仅在对象中没有其他键时才允许键。

    【讨论】:

    • 我认为它不起作用,因为没有条件检查“没有 responseUrl 和没有 successUrl 和没有 failUrl”。 .AND 用 failUrl 或 NONE 检查successUrl(可以说没有),所以它通过了,然后 .WHITOUT 说如果是 responseUrl,则不能有 successUrl 或 failUrl,可以说没有 responseUrl,所以它再次通过。
    • @DomingoSL 好的,您的问题并不清楚这个要求。我已经更新了我的答案以包含一个应该满足该条件的.or()
    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2021-09-14
    • 2013-06-15
    • 2011-07-21
    相关资源
    最近更新 更多