【发布时间】:2018-10-13 20:01:45
【问题描述】:
我正在为我的 HTTP 请求使用 Joi 验证器。我有一个名为type 的参数。我需要确保参数的可能值是“ios”或“android”。
我该怎么做?
body : {
device_key : joi.string().required(),
type : joi.string().required()
}
【问题讨论】:
标签: node.js validation express joi
我正在为我的 HTTP 请求使用 Joi 验证器。我有一个名为type 的参数。我需要确保参数的可能值是“ios”或“android”。
我该怎么做?
body : {
device_key : joi.string().required(),
type : joi.string().required()
}
【问题讨论】:
标签: node.js validation express joi
您可以使用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()接受很多字符串,不是字符串数组。
也许它对任何想要根据现有枚举/值数组检查值的人很有用。
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() 需要一个数组。所以删除...
.valid() 不再接受数组参数,因此我们需要使用... 来展开数组。见:github.com/sideway/joi/issues/1449
我迟到了这个答案。 但以下内容将有助于其他想要将枚举值与 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);
【讨论】:
对于打字稿用户,
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));
【讨论】: