如何在Joi字符串验证中使用枚举值

时间:2018-05-03 13:24:09

标签: node.js validation express joi

我正在使用Joi验证器来处理我的HTTP请求。我有一个名为type的参数。我需要确保参数的可能值是" ios"或" android"。

我该怎么做?

body : {
  device_key : joi.string().required(),
  type : joi.string().required()
}

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:6)

对于任何想根据现有枚举/值数组检查值的人来说,它可能都会很有用。

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

答案 2 :(得分:1)

对于打字稿用户,

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

答案 3 :(得分:0)

我迟到了这个答案。 但是,下面的步骤对希望通过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