【问题标题】:Joi validator only one of keysJoi 验证器只有一个键
【发布时间】:2019-07-08 18:47:11
【问题描述】:

我正在开发一个应该允许多个参数的 api,但对于其中三个,我只想允许其中一个。 每个键的值更容易,但我想知道 Joi 是否也允许它,或者我应该在我的服务器中添加额外的验证逻辑。

简而言之,对于 abc 键,我希望任何具有三个以上之一的请求都失败,所以:

  1. http://myapi.com/?a=value有效请求。

  2. http://myapi.com/?b=value&c=value2无效

谢谢!

【问题讨论】:

    标签: javascript node.js joi


    【解决方案1】:

    如果需要abc 中的一个,则您正在寻找object.xor(peers)

    定义一组键之间的排他关系,其中一个是必需的,但不是同时,其中:

    • peers - 不能一起出现但需要其中一个的唯一键名。 peers 可以是单个字符串值、字符串值数组或作为参数提供的每个对等点。
    const schema = Joi.object().keys({
        a: Joi.any(),
        b: Joi.any(),
        c: Joi.any()
    }).xor('a', 'b', 'c');
    

    或者,object.oxor(peers),如果只允许 abc 之一,但没有一个是必需的。

    定义一组键之间的排他关系,其中只允许一个但不需要一个,其中:

    • peers - 不能一起出现但不需要的唯一键名。
    const schema = Joi.object().keys({
        a: Joi.any(),
        b: Joi.any(),
        c: Joi.any()
    }).oxor('a', 'b', 'c');
    

    【讨论】:

      【解决方案2】:

      我想我会用 Joi.try 来做。

      const one_of_them = {
            query: Joi.alternatives().try(
              {
                a: Joi.string().required(),
                b: Joi.string().invalid().required(),
                c: Joi.string().invalid().required(),
              },
              {
                b: Joi.string().required(),
                a: Joi.string().invalid().required(),
                c: Joi.string().invalid().required(),
              },
              {
                c: Joi.string().required(),
                a: Joi.string().invalid().required(),
                b: Joi.string().invalid().required(),
              },
            ),
          };
      

      但是,也许另一种解决方案会更好。

      【讨论】:

        猜你喜欢
        • 2019-06-04
        • 2017-01-22
        • 2020-05-30
        • 2017-08-05
        • 2019-03-23
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        相关资源
        最近更新 更多