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

Era*_*uwa 11 validation node.js express joi

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

我怎样才能做到这一点?

body : {
  device_key : joi.string().required(),
  type : joi.string().required()
}
Run Code Online (Sandbox Code Playgroud)

Abh*_*avD 23

你可以用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);
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误 ValidationError: child "type" fails because ["type" must be one of [ios, android]]

  • 读者请注意,“valid()”接受许多字符串,*而不是*字符串数组。 (6认同)

Max*_*zov 21

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

const SomeEnumType = { TypeA: 'A', TypeB: 'B' };
Run Code Online (Sandbox Code Playgroud)

然后只需使用这个:

const schema = Joi.object().keys({
  type: Joi.string().valid(...Object.values(SomeEnumType)),
});

const myObj = { type: 'none' };
const result = Joi.validate(myObj, schema);
Run Code Online (Sandbox Code Playgroud)

  • 你不需要传播`Object.values()`,因为`valid()`需要一个数组。所以删除`...` (2认同)
  • 在最新版本的 Joi 上,“.valid()”不再接受数组参数,因此我们需要使用“...”来扩展数组。请参阅:https://github.com/sideway/joi/issues/1449 (2认同)

Kar*_*iem 7

对于打字稿,我认为最直接的方法是将枚举的值添加为有效值。

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

Joi.string()
  // .allow(null) // uncomment this line to allow 'null'
  .valid(... Object.values(DeviceType))
Run Code Online (Sandbox Code Playgroud)

这本质上是jaroraSinapcs在之前的答案中建议的,没有单独的功能。

  • +1用于演示实际的“枚举”并且没有额外的函数。然而遗憾的是,这不适用于 `const enum` :( (2认同)