如何在 Joi String 验证中使用枚举值

我正在对 HTTP 请求使用 Joi 验证器。这里有一个参数 type。我需要确保参数的可能值是“ ios”或“ android”。

我该怎么做?

body : {
device_key : joi.string().required(),
type : joi.string().required()
}
55811 次浏览

你可以使用 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]]

对于希望基于现有枚举/值数组检查值的任何人来说,它可能会很有用。

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);

我要迟到了。 但是下面的内容对于那些希望在 Joi String 验证中使用枚举值的人来说是有帮助的:

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

对于打字稿用户,

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));
function getEnumValues<T extends string | number>(e: any): T[] {
return typeof e === 'object' ? Object.values(e) : [];
}


Joi.string().valid(...getEnumValues(YOUR_ENUM));

对于类型脚本,我认为最直接的方法是将枚举的值作为有效值添加。

enum DeviceType {
iOS = 'ios',
Android = 'android',
}


Joi.string()
// .allow(null) // uncomment this line to allow 'null'
.valid(... Object.values(DeviceType))

这基本上就是 JaroraSinapcs在以前的答案中所建议的,没有单独的函数。