【问题标题】:How to use enum values with Joi String validation如何在 Joi 字符串验证中使用枚举值
【发布时间】: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


    【解决方案1】:

    您可以使用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()接受很多字符串,不是字符串数组。
    【解决方案2】:

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

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

    【讨论】:

    • 这也适用于数组。例如,当您有一组您可能想要验证的角色时非常有用。感谢@max-podriezov,它帮助我解决了我的案例。
    • 你不需要传播Object.values(),因为valid() 需要一个数组。所以删除...
    • 在最新版本的 Joi 中,.valid() 不再接受数组参数,因此我们需要使用... 来展开数组。见:github.com/sideway/joi/issues/1449
    【解决方案3】:

    我迟到了这个答案。 但以下内容将有助于其他想要将枚举值与 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);
    

    参考:https://hapi.dev/module/joi/api/#anyallowvalues

    【讨论】:

      【解决方案4】:

      对于打字稿用户,

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

      【讨论】:

        【解决方案5】:
        function getEnumValues<T extends string | number>(e: any): T[] {
            return typeof e === 'object' ? Object.values(e) : [];
        }
        
        Joi.string().valid(...getEnumValues(YOUR_ENUM));
        

        【讨论】:

        • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。
        猜你喜欢
        • 2020-02-17
        • 2017-01-29
        • 1970-01-01
        • 2022-01-08
        • 2021-05-20
        • 2011-09-11
        • 1970-01-01
        • 2018-06-01
        • 2018-05-29
        相关资源
        最近更新 更多