如何在 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 字符串验证中使用枚举值的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs - Joi 检查字符串是不是在给定列表中

数组的Joi验证

在 joi 和 express-validation 中允许字符串为空或空

koa中使用joi进行参数校验

使用 Joi,要求两个字段之一不为空

如何使用 Joi 验证对象数组?