我正在使用Joi验证HTTP请求中的标头。 我有两个标题。如果存在FOO,则需要BAR,否则BAR是可选的。这有效:
'FOO': Joi.string().optional(),
'BAR': Joi.string().when('FOO', { is: Joi.not(''), then: Joi.required() })
如果我希望FOO是一个数字值,那么可以这样做:
'FOO': Joi.number().integer().default(0).optional(),
'BAR': Joi.string().when('FOO', { is: Joi.number().min(1), then: Joi.required() })
但是,如果我省略default(0),那么Joi认为当FOO不存在时,需要BAR。那是正确的行为吗?有更好的方法来解决这个问题吗?
答案 0 :(得分:0)
使用.with()
可以使这一过程变得简单得多。考虑以下架构:
const schema = Joi.object().keys({
FOO: Joi.number().default(0).min(1),
BAR: Joi.string()
}).with('FOO', 'BAR');
仅当存在.with()
时,BAR
才强制使用FOO
。
也类似于您的示例,它还将确保FOO
必须大于或等于1
(如果它实际上在有效负载中),否则Joi会将其默认为0
。