问题描述
问题
我有一个从 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() })
});