【问题标题】:Does Joi have the concept of "not"?Joi有“不”的概念吗?
【发布时间】:2021-05-03 14:43:20
【问题描述】:

问题

我有一个从 JSON 字符串解析的对象。我想确认它的字段只包含原始类型(例如数字、布尔值、字符串)。具体来说,我想确认所有字段值不是object

Joi 有not 的概念吗?我可以在不列出所有可能的非对象类型的情况下这样做吗?

尝试

我尝试使用any.disallow,这几乎是我所需要的(并且,我在发布我的问题后意识到,它被列为具有别名not)。

import Joi from 'joi'

const schema = Joi.object().keys({ 
  myKey: Joi.any().not(Joi.object()),
})

但是,这似乎具有价值。这意味着它不会与模式进行比较,并且会认为不是 Joi.object() 返回的文字值的任何值都是有效的。

【问题讨论】:

    标签: node.js joi


    【解决方案1】:

    目前看来,答案可能是否定的。

    也就是说,可以为未纳入 Joi 的逻辑定义 custom validation functions

    以下方法确实有效:

    import Joi from 'joi'
    
    const schema = Joi.object().keys({ 
      myKey: Joi.any().custom(
        (value, helpers) => {
          if (typeof value === 'object' && value !== null) {
            return helpers.error('any.invalid');
          }
          return value
        },
        'is not an object',
      ),
    })
    

    【讨论】:

      【解决方案2】:

      我发现 this 只允许您接受原语,但它不是您要查找的 not

      const example = { 2: 'str', 3: 4, 4: true, 5: { 3: 2 } }
      
      Joi.object()
         .pattern(/^/, [Joi.boolean(), Joi.string(), Joi.number()])
         .validate(example)
      

      基本上,/^/ 是接受任意键的正则表达式,而数组是Joi.alternatives 的语法糖。

      编辑:我管理的模式在键是对象时失败

      Joi.object()
         .pattern(/^/, Joi.when(Joi.object(), { then: Joi.forbidden() }))
         .validate(example)
      

      我差点就到了

      Joi.object()
         .pattern(/^/, Joi.not(Object()))
         .validate(example)
      

      但它只适用于空对象,例如 {},我怀疑这与 Joi.not 只接受文字有关。

      【讨论】:

        【解决方案3】:

        我认为没有“不”选项。

        这是结合.when.forbidden 的另一种选择:

        const schema = Joi.object().keys({ 
          myKey: Joi.any(),
        }).when(Joi.object({ myKey: Joi.object() }), {
            then: Joi.object({ myKey: Joi.forbidden() })
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-24
          • 2012-06-25
          • 2016-09-02
          相关资源
          最近更新 更多