【问题标题】:Validate one of two fields to be present or none to be present based on value of another key根据另一个键的值验证两个字段之一是否存在或不存在
【发布时间】:2020-10-26 19:01:58
【问题描述】:

我必须根据一些条件进行验证:

如果键 pay_method 的值为 upi,则 其中一个键 services

combos 必须存在。

如果键 pay_method 的值是 pay_later,则 这些键都不存在

我尝试将.when.xor 以及.when.oxor 结合起来。

但是,我无法达到预期的效果。

Joi.object({
    pay_method: Joi.string().valid('upi', 'later').required(),
    combos: Joi.string().when('pay_method', {
      is: 'later',
      then: Joi.forbidden(),
    }),
    services: Joi.string().when('pay_method', {
      is: 'later',
      then: Joi.forbidden(),
    }),
  }).oxor('combos', 'services')
    .messages({ 'object.oxor': 'Both Combo and Service can not be ordered together!' })

待验证的数据:

{
  pay_method: 'later',
  combos: 'asdfasf',
}

根据文档:

xor : 不能一起出现但需要其中之一的键名

oxor : 不能一起出现但不需要的键名

请在此处使用以上详细信息进行测试https://joi.dev/tester/

【问题讨论】:

  • 我的回答解决了你的问题吗?

标签: javascript node.js joi


【解决方案1】:

当 pay_method 为 'upi' 时,前两个选项中的选项是在组合或服务之间进行选择。当 pay_method 为“稍后”时,最后一个不允许组合和服务同时存在。

Joi.alternatives().try(
    Joi.object({
        pay_method: Joi.string().valid('upi').required(),
        combos: Joi.required(),
        services: Joi.forbidden()
    }),
    Joi.object({
        pay_method: Joi.string().valid('upi').required(),
        combos: Joi.forbidden(),
        services: Joi.required()
    }),
    Joi.object({
        pay_method: Joi.string().valid('later').required(),
        combos: Joi.forbidden(),
        services: Joi.forbidden()
    })
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多