V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
KouShuiYu
V2EX  ›  分享创造

分享一个 JavaScript 验证 JSON 合法性的库[@ckpack/parameter](https://github.com/ckpack/parameter)

  •  
  •   KouShuiYu ·
    ckvv · 2021-09-30 16:19:26 +08:00 · 576 次点击
    这是一个创建于 953 天前的主题,其中的信息可能已经有所发展或是发生改变。

    @ckpack/parameter

    例子

    通过简单的配置就可以验证参数

    import { Parameter } from '@ckpack/parameter';
    const parameter = new Parameter();
    
    const rule = {
      isAdmin: 'boolean',
      age: {
        type: 'int',
        min: 0,
        max: 200,
      },
      ids: {
        type: 'array',
        itemType: 'int',
        itemRule: {
          min: 1
        }
      }
    }
    
    const data = {
      isAdmin: true,
      age: 18,
      ids: ['1', '2', '3']
    };
    
    const errors = parameter.validate(rule, data);
    

    支持的验证类型

    int

    如果类型为int,则有以下选项规则

    • max - 值的最大值,值必须 <= max
    • min - 值的最小值,值必须 >= min
    {
      score: 'int',
    }
    // or
    {
      score: {
        type: 'int',
        min: 0,
        max: 200,
      }
    }
    

    number

    如果类型为number,则有以下选项规则

    • max - 值的最大值,值必须 <= max
    • min - 值的最小值,值必须 >= min
    {
      score: 'number',
    }
    // or
    {
      score: {
        type: 'number',
        min: 0,
        max: 100,
      }
    }
    

    string

    如果类型为string,则有以下选项规则

    • regex - 检查字符串格式的正则表达式
    • max - 字符串的最大长度
    • min - 字符串的最小长度
    {
      username: 'string',
    }
    // or
    {
      username: {
        type: 'string',
        regexp: /\S{4,20}/
      }
    }
    

    boolean

    检查是否是boolean类型

    {
      isAll: 'boolean',
    }
    // or
    {
      isAll: {
        type: 'boolean',
      }
    }
    

    array

    如果类型是数组,则有以下选项规则

    • itemType - 此数组中每个项目的类型
    • itemRule - 此规则中每个项目的规则
    • itemChecker- 每个项目的检查器,在这种情况下,您可以省略 itemTypeitemRule
    • max - 数组的最大长度
    • min - 数组的最小长度
    {
      ids: {
        itemType: 'int',
        itemRule: {
          min: 1,
          max: 1000,
        },
        min: 0,
        max: 100,
      }
    }
    
    

    enum

    如果类型是enum,则有以下规则

    • enum - 数组,其中的值必须为其中一个
    {
      sex: ['man', 'woman']
    }
    // or
    {
      sex: {
        type: 'enum'
        enum: ['man', 'woman']
      }
    }
    

    object

    如果类型是对象,则有以下规则 rule - 验证对象属性的对象

    {
      people: {
        type: 'object',
        rule: {
          name: 'string',
          age: {
            isRequired: false,
            type: 'int',
            min: 1,
            max: 200
          }
        }
      }
    }
    

    custom

    你也可以定义自定义验证类型

    import { Parameter } from '@ckpack/parameter';
    const parameter = new Parameter();
    // 验证是否为偶数
    parameter.addRule('even', (rule, value) => {
      return value % 2 === 0 ? null : `${value} is not even`;
    });
    
    // rule
    {
      someNumber: 'even'
    }
    // or
    {
      someNumber: {
        type: "even",
      }
    }
    

    对于自定义验证类型你也可以添加参数如:

    import { Parameter } from '@ckpack/parameter';
    const parameter = new Parameter();
    
    // 验证能否被某个数字整除
    parameter.addRule('times', (rule, value) => {
      const { times } = rule;
      return value % times === 0 ? null : `not an integer multiple of ${times}`;
    });
    
    // rule
    {
      someNumber: {
        type: "times",
        times: 3,
      }
    }
    

    =

    AoEiuV020
        1
    AoEiuV020  
       2021-09-30 19:11:04 +08:00 via Android
    这种应该有更流行靠谱的轮子吧,
    与其介绍具体用法,不如说说有什么优势,可以参考米式对比法,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1555 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:06 · PVG 01:06 · LAX 10:06 · JFK 13:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.