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

2021-09-30 16:19:26 +08:00
 KouShuiYu

@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,则有以下选项规则

{
  score: 'int',
}
// or
{
  score: {
    type: 'int',
    min: 0,
    max: 200,
  }
}

number

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

{
  score: 'number',
}
// or
{
  score: {
    type: 'number',
    min: 0,
    max: 100,
  }
}

string

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

{
  username: 'string',
}
// or
{
  username: {
    type: 'string',
    regexp: /\S{4,20}/
  }
}

boolean

检查是否是boolean类型

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

array

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

{
  ids: {
    itemType: 'int',
    itemRule: {
      min: 1,
      max: 1000,
    },
    min: 0,
    max: 100,
  }
}

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,
  }
}

=

635 次点击
所在节点    分享创造
1 条回复
AoEiuV020
2021-09-30 19:11:04 +08:00
这种应该有更流行靠谱的轮子吧,
与其介绍具体用法,不如说说有什么优势,可以参考米式对比法,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/805441

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX