【问题标题】:Joi validator only one of keysJoi 验证器只有一个键
【发布时间】:2019-07-08 18:47:11
【问题描述】:
我正在开发一个应该允许多个参数的 api,但对于其中三个,我只想允许其中一个。
每个键的值更容易,但我想知道 Joi 是否也允许它,或者我应该在我的服务器中添加额外的验证逻辑。
简而言之,对于 a、b 或 c 键,我希望任何具有三个以上之一的请求都失败,所以:
http://myapi.com/?a=value 是有效请求。
http://myapi.com/?b=value&c=value2无效。
谢谢!
【问题讨论】:
标签:
javascript
node.js
joi
【解决方案1】:
如果需要a、b 或c 中的一个,则您正在寻找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),如果只允许 a、b 或 c 之一,但没有一个是必需的。
定义一组键之间的排他关系,其中只允许一个但不需要一个,其中:
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(),
},
),
};
但是,也许另一种解决方案会更好。