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

时间:2018-07-10 10:46:21

标签: node.js joi

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

    没有 errorUrl ,就不能显示
  1. successUrl (反之亦然)

  2. 如果存在 succesUrl 和/或 failUrl

    ,则不能显示
  3. responseUrl

  4. 在架构中,如果没有 responseUrl ,则必须存在一对 successUrl failUrl (反之亦然) )

我设法使前两个条件起作用,但是某些情况下忽略了应该使 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');

我显然使用错误,请链接到format

1 个答案:

答案 0 :(得分:0)

我认为我已经设法仅使用.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()仅在对象中没有其他键时才允许键。