Я использую валидатор Joi для своих HTTP-запросов. Там у меня есть параметр под названием type. Мне нужно убедиться, что возможные значения параметра - «ios» или «android».
Как я могу это сделать?
body : {
device_key : joi.string().required(),
type : joi.string().required()
}





Вы можете использовать valid.
const schema = Joi.object().keys({
type: Joi.string().valid('ios', 'android'),
});
const myObj = { type: 'none' };
const result = Joi.validate(myObj, schema);
console.info(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);
вам не нужно распространять Object.values(), поскольку valid() принимает массив. так что удалите ...
Я опаздываю на этот ответ. Но следующее будет полезно для других, кто хочет использовать значения перечисления с проверкой строки 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);
reference : 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));
Это также работает для массивов. Очень полезно, когда у вас есть, например, набор ролей, по которым вы, возможно, захотите проверить. Спасибо @ max-podriezov, это помогло мне с моим сценарием дела.