如何在 Joi 字符串验证中使用枚举值
Posted
技术标签:
【中文标题】如何在 Joi 字符串验证中使用枚举值【英文标题】:How to use enum values with Joi String validation 【发布时间】:2018-10-13 20:01:45 【问题描述】:我正在为我的 HTTP 请求使用 Joi 验证器。我有一个名为type
的参数。我需要确保参数的可能值是“ios”或“android”。
我该怎么做?
body :
device_key : joi.string().required(),
type : joi.string().required()
【问题讨论】:
【参考方案1】:您可以使用valid
。
const schema = Joi.object().keys(
type: Joi.string().valid('ios', 'android'),
);
const myObj = type: 'none' ;
const result = Joi.validate(myObj, schema);
console.log(result);
这会产生错误ValidationError: child "type" fails because ["type" must be one of [ios, android]]
【讨论】:
读者注意valid()
接受很多字符串,不是字符串数组。【参考方案2】:
也许它对任何想要根据现有枚举/值数组检查值的人很有用。
const SomeEnumType = TypeA: 'A', TypeB: 'B' ;
那就用这个吧:
const schema = Joi.object().keys(
type: Joi.string().valid(...Object.values(SomeEnumType)),
);
const myObj = type: 'none' ;
const result = Joi.validate(myObj, schema);
【讨论】:
这也适用于数组。例如,当您有一组您可能想要验证的角色时非常有用。感谢@max-podriezov,它帮助我解决了我的案例。 你不需要传播Object.values()
,因为valid()
需要一个数组。所以删除...
在最新版本的 Joi 中,.valid()
不再接受数组参数,因此我们需要使用...
来展开数组。见:github.com/sideway/joi/issues/1449【参考方案3】:
我迟到了这个答案。 但以下内容将有助于其他想要将枚举值与 Joi 字符串验证一起使用的人:
function validateBody(bodyPayload)
const schema = Joi.object(
device_key : Joi.string().required(),
type : Joi.string().valid('ios','android'),
);
return schema.validate(admin);
const bodyPayload = device_key:"abc", type: "web";
const result = validateBody(bodyPayload);
参考:https://hapi.dev/module/joi/api/#anyallowvalues
【讨论】:
【参考方案4】:对于打字稿用户,
getEnumValues<T extends string | number>(e: any): T[]
return typeof e === 'object' ? Object.keys(e).map(key => e[key]) : [];
Joi.string().valid(...getEnumValues(YOUR_ENUM));
【讨论】:
【参考方案5】:function getEnumValues<T extends string | number>(e: any): T[]
return typeof e === 'object' ? Object.values(e) : [];
Joi.string().valid(...getEnumValues(YOUR_ENUM));
【讨论】:
您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。以上是关于如何在 Joi 字符串验证中使用枚举值的主要内容,如果未能解决你的问题,请参考以下文章