async-validator --- 中文文档

目录

async-validator

Install

Usage

API

Validate

Rules

Type 内置类型

Required

Pattern

Range

Length

Enumerable

Whitespace

Deep Rules 深层规则

defaultField 默认字段

Transform 变换

Messages 提示信息

asyncValidator 异步校验函数

validator 校验函数

FAQ


async-validator

一个用于表单异步校验的库,参考了 ​ ​https://github.com/freeformsystems/async-validate​​

API
下述内容来自于 ​ ​async-validate​​. 的早期版本

Usage 使用方法
基本的使用方法:定义一个 descriptor,将它传入 schema,得到一个 validator。将需要校验的对象和回调传入 validator.validate 方法中。

注:descriptor 是对校验规则的描述,validator 是根据校验规则得到的校验器

Install

npm i async-validator

Usage

基本的使用方法:定义一个 descriptor,将它传入 schema,得到一个 validator。将需要校验的对象和回调传入 validator.validate 方法中。

var schema = require('async-validator');
var descriptor = {name: {type: "string",required: true,validator: (rule, value) => value === 'muji',},
};
var validator = new schema(descriptor);
validator.validate({name: "muji"}, (errors, fields) => {if(errors) {// validation failed, errors is an array of all errors// fields is an object keyed by field name with an array of// errors per field// 校验未通过的情况,errors 是所有错误的数组// fields 是一个 object,以字段作为 key 值,该字段对应的错误数组作为 value// (其实 fields 就是把 errors 按照原对象的 key 值分组)return handleErrors(errors, fields);}// validation passed// 这里说明校验已通过
});// PROMISE USAGE
// Promise 式用法validator.validate({name: "muji",asyncValidator: (rule, value) => axios.post('/nameValidator', { name: value }),
}, (errors, fields) => {if(errors) {// validation failed, errors is an array of all errors// fields is an object keyed by field name with an array of// errors per field// 校验未通过的情况,errors 和 fields 同上return handleErrors(errors, fields);}// validation passed// 校验通过
}).then(() => {// validation passed// 校验通过}).catch(({ errors, fields }) => {return handleErrors(errors, fields);})

API

Validate

function(source, [options], callback): Promise
  • ​​source​​: 需要校验的对象(必填).
  • ​​options​​: 校验选项(可选).
  • ​​callback​​: 校验完成时的回调(必填).

方法返回一个 Promise 对象:

  • ​​then()​​,说明校验通过
  • ​​catch({ errors, fields })​​,校验未通过,errors, fields 含义见前面示例

Options 选项

suppressWarning: 布尔值,是否抑制有关无效值的内部警告。

first: 布尔值,当第一个验证规则生成错误时调用回调函数,不再处理更多的验证规则。如果您的验证涉及多个异步调用(例如数据库查询)并且只需要第一个错误,请使用此选项。

firstFields: 布尔值|字符串数组,当指定字段的第一个验证规则生成错误时调用回调函数,不再处理同一字段的更多验证规则。true 表示所有字段。

Rules


Rules 也可以是用于校验的函数

function(rule, value, callback, source, options)
  • ​​rule​​: 当前校验字段在 descriptor 中所对应的校验规则,其中的 field 属性是当前正在校验字段的名称
  • ​​value​​: 当前校验字段的值
  • ​​callback​​​: 在校验完成时的回调,传入​​Error​​​ [或者是一个数组] 代表校验失败,如果校验是同步的话,直接返回​​false​​​ 或​​Error​​​ 或​​Error​​​ 数组也可以(注:异步校验通过时直接不带参数调用​​callback()​​,代表没有错误)
  • ​​source​​​: 传入​​validate​​ 方法的 object,也就是需要校验的对象
  • ​​options​​: 传入的额外选项
  • ​​options.messages​​: 对象包含的校验错误提示信息,会被合并到默认的提示信息中
  • 传入 ​​validate​​​ 或 ​​asyncValidate​​​ 的 options 被带到了校验函数中,以便你可以在校验函数中拿到数据(比如 model 引用)。然而,option中部分属性名是被保留的,你如果使用了的话会被覆盖掉,其中包括 ​​messages​​​, ​​exception​​​ 和 ​​error​​。
var schema = require('async-validator');
var descriptor = {name(rule, value, callback, source, options) {var errors = [];if(!/^[a-z0-9]+$/.test(value)) {errors.push(new Error(util.format("%s must be lowercase alphanumeric characters",rule.field)));}return errors;}
}
var validator = new schema(descriptor);
validator.validate({name: "Firstname"}, (errors, fields) => {if(errors) { return handleErrors(errors, fields);}// validation passed
});

在需要对一个字段设置多条校验规则时,可以把规则设为一个数组,比如

var descriptor = {email: [{type: "string", required: true, pattern: schema.pattern.email},{validator(rule, value, callback, source, options) {var errors = [];// test if email address already exists in a database// and add a validation error to the errors array if it doesreturn errors;}}]
}

Type 内置类型


下列是 ​​type​​ 可用的值:

  • ​​string​​​: 必须是​​string​​​.​​This is the default type.​​
  • ​​number​​​: 必须是​​number​​.
  • ​​boolean​​​: 必须是​​boolean​​.
  • ​​method​​​: 必须是​​function​​.
  • ​​regexp​​​: 必须是正则或者是在调用​​new RegExp​​ 时不报错的字符串.
  • ​​integer​​: 整数.
  • ​​float​​: 浮点数.
  • ​​array​​​: 必须是数组,通过​​Array.isArray​​ 判断.
  • ​​object​​: 是对象且不为数组.
  • ​​enum​​​: 值必须出现在​​enmu​​ 枚举值中.
  • ​​date​​​: 合法的日期,使用​​Date​​ 判断
  • ​​url​​: url.
  • ​​hex​​: 16进制.
  • ​​email​​: 邮箱地址.

Required

​​required​​ 属性代表这个字段必须出现在对象中

Pattern

​​pattern​​ 属性代表需要符合的正则

Range

使用 ​​min​​​ 和 ​​max​​​ 属性定义范围,对于字符串和数组会与 ​​value.length​​ 比较,对于数字会直接与值比较

Length

使用 ​​len​​ 属性直接指定长度,会与字符串和数组的 ​​value.length​​ 比较相等,对于数字会直接与值比较是否相等

如果 ​​len​​ 与 ​​min​​ 和 ​​max​​ 同时使用, ​​len​​ 优先。

Enumerable

可枚举值

对于可以枚举出所有情况的类型,可以使用枚举校验,如下:


Whitespace

把仅包含空格的字段视为错误是很典型的做法,为了额外测试字段是否只有空格,添加 ​​whitespace​​​ 属性并设为true。这个属性要求字段必须为 ​​string​​ 类型。

如果你想要修正用户的输入而不是测试有无空格,查看 transform 中去除空格的例子。

const descriptor = {role: { type: 'enum', enum: ['admin', 'user', 'guest'] },
};

Deep Rules 深层规则

如果需要校验一个深层的对象,你需要使用 ​​fields​​ 属性来设置嵌套的规则

var descriptor = {address: {type: "object", required: true,fields: {street: {type: "string", required: true},city: {type: "string", required: true},zip: {type: "string", required: true, len: 8, message: "invalid zip"}}},name: {type: "string", required: true}
}
var validator = new schema(descriptor);
validator.validate({ address: {} }, (errors, fields) => {// errors for address.street, address.city, address.zip
});

请注意,如果您在父规则上没有指定所需的属性,那么在源对象上可能没有声明该字段,深度验证规则将不会被执行,因为没有东西可以进行验证。

深度规则验证会为嵌套规则创建模式,因此您还可以指定传递给schema.validate()方法的选项。

const descriptor = {address: {type: 'object',required: true,options: { first: true },fields: {street: { type: 'string', required: true },city: { type: 'string', required: true },zip: { type: 'string', required: true, len: 8, message: 'invalid zip' },},},name: { type: 'string', required: true },
};
const validator = new Schema(descriptor);validator.validate({ address: {} }).catch(({ errors, fields }) => {// now only errors for street and name    });

如果你像下面这样写,父规则也会被校验

const descriptor = {roles: {type: 'array',required: true,len: 3,fields: {0: { type: 'string', required: true },1: { type: 'string', required: true },2: { type: 'string', required: true },},},
};

比如用于 ​​{roles: ["admin", "user"]}​​​ 会产生两个错误,一个是数组长度不匹配,一个是缺少了索引为 ​​2​​ 的元素

defaultField 默认字段


​​defaultField​​​ 属性可以在 ​​array​​​ 和 ​​object​​ 类型中用于校验所有的值,它可以是一个包含有校验规则的对象或数组。 例子如下:

var descriptor = {urls: {type: "array", required: true,defaultField: {type: "url"}}
}

注意,​​defaultField​​​ 是 ​​fields​​​ 的扩展,见 deep rules.

Transform 变换


有时候需要在校验前修改值,强制修改为特定格式。 为此在校验规则中添加了 ​​transform​​, 这个属性会在校验前执行,以适当的方式改变原始对象的值。(也就是返回值会作用在原始对象的值上)

var schema = require('async-validator');
var sanitize = require('validator').sanitize;
var descriptor = {name: {type: "string",required: true, pattern: /^[a-z]+$/,transform(value) {return sanitize(value).trim();}}
}
var validator = new schema(descriptor);
var source = {name: " user  "};
validator.validate(source).then(() => assert.equal(source.name, "user"));

如果没有 ​​transform​​​ 函数校验会失败因为前后空格导致正则与输入不符,但在添加了 ​​transform​​ 函数后便可通过因为字段已经被清洗了(或者翻译为使输入值符合预期格式)

Messages 提示信息


在某些需求下,你可能需要格式化支持或者想要不同校验错误信息。

最简单的方式就是直接为 ​​message​​ 属性赋值:

{name:{type: "string", required: true, message: "Name is required"}}

消息可以是任意类型的,比如 ​​JSX​​:

{name:{type: "string", required: true, message: <b>Name is required</b>}}

也可以是函数,比如使用 vue-i18n 时:

{name:{type: "string", required: true, message: () => this.$t( 'name is required' )}}

有时候你只是需要对相同的校验规则定义不同语言的提示信息,在这种情况下为各种语言重复定义信息就显得很多余。

var schema = require('async-validator');
var cn = {required: '%s 必填',
};
var descriptor = {name:{type: "string", required: true}};
var validator = new schema(descriptor);
// deep merge with defaultMessages
validator.messages(cn);
...

如果你要定义自己的校验函数,最好将提示信息赋值给消息对象,并在校验函数中通过 ​​options.messages​​ 访问消息。(说实话我没看懂是什么意思,应该是指不要把消息硬编码写在校验函数里面而是通过option传递,以便修改)

asyncValidator 异步校验函数
 

你可以对指定的字段自定义包含异步操作的校验函数

const fields = {asyncField: {asyncValidator(rule, value, callback) {ajax({url: 'xx',value: value,}).then(function(data) {callback();}, function(error) {callback(new Error(error));});},},promiseField: {asyncValidator(rule, value) {return ajax({url: 'xx',value: value,});},},
};

validator 校验函数


你也可像下面这样自定义校验函数:

const fields = {field: {validator(rule, value, callback) {return value === 'test';},message: 'Value is not equal to "test".',},field2: {validator(rule, value, callback) {return new Error(`${value} is not equal to 'test'.`);},},arrField: {validator(rule, value) {return [new Error('Message 1'),new Error('Message 2'),];},},
};

FAQ


How to avoid warning 如何关闭警告
 

import Schema from 'async-validator';
Schema.warning = function(){};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【web3技术】什么是 WEB3?

Web3 简介 中心化网络已经帮助数十亿人融入了互联网,并在其上创建了稳定、可靠的基础设施。 与此同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为。 Web3 是摆脱这一困境的方案。 不同于科技巨头垄断的传统互联网,Web3 采用去中心化,由所有用户构建、运营和拥有。…

day57 判断子序列 不同的子序列 两个字符串的删除操作 编辑距离

题目1 392 判读子序列 题目链接 392 判断子序列 题意 判断字符串s是否为字符串t的子序列 &#xff08;子序列的相对位置在原字符串中不改变&#xff09; 就是求最长公共子序列的长度与字符串s的长度是否相等 动态规划 1&#xff09;确定dp数组及下标i的含义 dp[i][j]…

城市预约挂号统一平台的实现

目录 一、需求分析 二、界面设计 ​ 三、前端开发 四、代码下载 一.需求分析 二、界面设计 三、前端开发 <!DOCTYPE html> <html lang"zh-ch"> <head><meta charset"UTF-8"><title>基本样式页</title><link rel…

Python中的可哈希与不可哈希对象详解

文章目录 1. 前置知识&#xff1a;哈希是什么2. 可哈希和不可哈希对象的定义2.1可哈希2.2 不可哈希 3. 对象的哈希方法3.1 自定义对象的哈希方法3.2 可哈希性与等价性3.3 哈希值的用途 推荐 在复习可变对象和不可变对象时&#xff0c;学到了这个内容 1. 前置知识&#xff1a;哈…

宜搭无权查询该应用信息,唯一排查码:21081d4e17130865292352743e9ed8

这种问题可能是关联表单出现了问题&#xff0c;当前应用中没有这个表单 所以就出现了应用无权访问的问题

【第二十四篇】使用Burpsuite实现反射、储存、DOM型XSS(靶场实战案例)

目录 反射性XSS储存型XSSDOM XSS反射性XSS 搜索1后,审查元素: 猜测<font>标签中没有进行XSS特殊字符转义,而在<font>标签内,可使用<script>标签: <script>alert(1)</script>储存型XSS 该模块对姓名、电子邮件、网站做过滤处理,但评论处…

深度学习| 交叉熵损失函数(包含代码实现)

前言&#xff1a;因为我深度学习主要用于图像分割&#xff0c;所以交叉熵损失函数主要侧重在图像分割。 交叉熵损失函数 介绍公式交叉熵函数存在什么问题带权重的交叉熵函数代码 介绍 交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;是深度学习中常用的一种损失函…

基于深度学习的生活垃圾智能分类系统(微信小程序+YOLOv5+训练数据集+开题报告+中期检查+论文)

摘要 本文基于Python技术&#xff0c;搭建了YOLOv5s深度学习模型&#xff0c;并基于该模型研发了微信小程序的垃圾分类应用系统。本项目的主要工作如下&#xff1a; &#xff08;1&#xff09;调研了移动端垃圾分类应用软件动态&#xff0c;并分析其优劣势&#xff1b;分析了深…

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

"><--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景:如何解决:同一时刻,连续调用多次CanIf_Transmit / Can_Write API,同时发送不同CANID帧,出现丢帧问题。 目录(共9页精讲,基于评估板: NXP S32K312EVB-Q172,手把手教你S32K3从入门到精通) 实现的架…

LeetCode-热题100:5. 最长回文子串

题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a; s “babad” 输出&#xff1a; “bab” 解释&#xff1a; “aba” 同样是符合题意的答案…

鸿蒙开发学习笔记第一篇--TypeScript基础语法

目录 前言 一、ArkTS 二、基础语法 1.基础类型 1.布尔值 2.数字 3.字符串 4.数组 5.元组 6.枚举 7.unkown 8.void 9.null和undefined 10.联合类型 2.条件语句 1.if语句 1.最简单的if语句 2.if...else语句 3.if...else if....else 语句 2.switch语句 5.函数…

Java 入门教程||Java 关键字

Java 关键字 Java教程 - Java关键字 Java中的关键字完整列表 关键词是其含义由编程语言定义的词。 Java关键字和保留字&#xff1a; abstract class extends implements null strictfp true assert const false import package super try …

二叉排序树的增删改查(java版)

文章目录 1. 基本节点2. 二叉排序树2.1 增加节点2.2 查找&#xff08;就是遍历&#xff09;就一起写了吧2.3 广度优先遍历2.4 删除&#xff08;这个有点意思&#xff09;2.5 测试样例 最后的删除&#xff0c;目前我测试的是正确的 1. 基本节点 TreeNode: class TreeNode{pri…

bugku-web-文件包含2

页面源码 <!-- upload.php --><!doctype html><html><head><meta charset"utf-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

Zabbix_Agent一键安装脚本(包含ansible-playbook批量执行脚本)

为了快速安装配置zabbix_agent&#xff0c;特地写了此shell脚本&#xff0c;脚本实现功能如下&#xff1a; 1、自动检测操作系统类型&#xff0c;目前支持Ubuntu/Centos/Redhat 2、自动获取安装agent主机IP地址 3、交互判断主机IP是否可用&#xff0c;用户输入正确IP地址 4、输…

技术周刊的转变:如何平衡热爱与现实?

大家好&#xff0c;我是那个自己打脸自己的猫哥&#xff0c;本来说周刊不做订阅制的&#xff0c;现在却推出了订阅专栏。今天想为自己辩护一下&#xff0c;同时聊聊技术周刊今后的发展计划。 首先回顾一下我过去的想法吧&#xff0c;然后再解释为什么会突然出现转变。 出于对…

2024.4.12力扣每日一题——找到冠军 I

2024.4.12 题目来源我的题解方法一 哈希表方法二 列式遍历统计方法三 列式遍历优化统计 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2923 我的题解 方法一 哈希表 哈希表存储不可能是冠军的队伍&#xff0c;最后没在哈希表中的队伍就是冠军。 时间复杂度&#xff1a…

Python学习之-Pandas详解

前言&#xff1a; Pandas 是一个开源的 Python 数据分析库&#xff0c;它提供了高性能、易于使用的数据结构和数据分析工具。Pandas提供 了方便的类表格和类SQL的操作&#xff0c;同时提供了强大的缺失值处理方法&#xff0c;可以方便的进行数据导入、选取、清洗、处理、合并、…

如何进行宏观经济预测

理性预期经济学提出了理性预期的概念&#xff0c;强调政府在制定各种宏观经济政策时&#xff0c;要考虑到各行为主体预期对政策实施有效性的影响&#xff0c;积极促成公众理性预期的形成&#xff0c;从而更好地实现宏观调控的目标。政府统计要深入开展统计分析预测研究&#xf…

poi-tl的使用(通俗易懂,全面,内含动态表格实现 包会!!)

最近在做项目时候有一个关于解析Html文件&#xff0c;然后将解析的数据转化成word的需求&#xff0c;经过调研&#xff0c;使用poi-tl来实现这个需求&#xff0c;自己学习花费了一些时间&#xff0c;现在将这期间的经验总结起来&#xff0c;让大家可以快速入门 poi-tl的介绍 …