Joi 有“不”的概念吗?

问题描述

问题

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

Joi 有 not 的概念吗?我可以在不列出所有可能的非对象类型的情况下执行此操作吗?

尝试

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

import Joi from 'joi'

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

然而,这似乎需要值。这意味着它不会与架构进行比较,并且会将任何不是由 Joi.object() 返回的文字值的值视为有效。

解决方法

目前看来答案是否定的。

也就是说,可以为未嵌入 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',),})
,

我发现 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 只接受文字有关。

,

我认为没有“不”选项。

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

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