简单讲一下这个egg-validate

egg-validate是基于parameter的。

安装
npm install --save egg-validate

启用

// config/plugin.js
exports.validate = {enable: true,package: 'egg-validate',
};

配置

// config/config.default.js
exports.validate = {// convert: false,// validateRoot: false,
};

用途嘛,就是对参数进行检验。比如检验一个用户名是不是字符串,可以这么写,
ctx.validate({ userName: 'string' });
默认就会对ctx.request.body进行检验
你想检验ctx.query的话,那就ctx.validate({ userName: 'string' }, ctx.query);,params就ctx.params。
它会在检验失败的抛出一个异常,没有捕获的话,会返回一个422错误。

第二种使用方法:

let errs = app.validator.validate({ userName: 'string' }, ctx.request.body);

ctx.validate检验不通过会抛出异常,而app.validator.validate检验不通过会返回错误。你可以自己选择要对这个错误怎么处理,是不管呢还是返回前端。

关于校验规则rule

完全和parameter的校验规则一样。建议直接看readme文档,虽然是英文的,但是配着翻译看个7788是差不多的。

ctx.validate({ userName: 'string' });这里面的rule就是{ userName: 'string' },它会这么检验,首先判断这个userName有没有在ctx.request.body里面,没有就跑出参数不存在、然后是userName不能为空、然后得是string。有一个不符合都会抛出错误。

你想判断一个用户的信息是否正确可以这么写:

ctx.validate({userName: 'userName', // 自定义的校验规则password: 'password', // 自带的校验规则sex: ['men', 'women'],    // 性别是men或者womenage: {type: 'number',         // 年龄范围0-120min: 0,max: 120}});

这里有个坑,年龄怎么填都会报格式错误,这是因为配置的时候默认把参数转型关了,配置回来就好:

  config.validate = {   // 配置参数校验器,基于parameterconvert: true,    // 对参数可以使用convertType规则进行类型转换// validateRoot: false,   // 限制被验证值必须是一个对象。};

主要使用的几个点,核心使用

1、使用自带的校验规则:

password: 'password',或者

password: {type: 'password',allowEmpty: true        // 设置密码为空,作为示例乱写一下。。
}

校验规则有这些,文档很详细了:

2、自定义的校验规则

通过app.validator.addRule添加:

  // 校验用户名是否正确app.validator.addRule('userName', (rule, value)=>{        // value就是待检验的数据if (/^\d+$/.test(value)) {return "用户名应该是字符串";}else if (value.length < 3 || value.length > 10) {console.log("用户名的长度应该在3-10之间");}});

这个可以直接放在app.js里面。return的就是错误消息message,但是err不止这个,还有错误字段啊啥的、都会帮我们自动包装好。

3、app.validator.addRule('userName', (rule, value)=>{里面这个字符串'userName'

添加了这个规则就可以直接使用ctx.validate({userName: 'userName'});
或者

ctx.validate({userName:  {type: 'userName',isAdmin: true'
});

4、app.validator.addRule('userName', (rule, value)=>{里面这个rule

像3、那样的规则就是把

 {type: 'userName',isAdmin: true'
}

直接赋值给rule传过来
{ type: 'userName', isAdmin: true }
然后你可以自己加判断,比如如果 isAdmin的话,管理员用户名不能有中文啊,长度至少5位啊啥的。

5、在哪里addRule

上面写的是推荐大家在app.js里面addRule。为什么呢?
当然你可以在任何你能取到app的地方调用app.validator.addRule('userName', (rule, value)=>{去addRule。

但是不建议在controller里面addRule。因为controller在每次路由匹配到之后都会进行实例化,所以请求了n遍,也就执行了这个addRule n遍。

而且代码会变的很臃肿。不易于管理。

在app.js addRule当然是很棒的,只在app加载时add一次。

但是问题又来了,随着rule变多,你在app.js里面写了很多代码都是关于addRule的,但是app.js又不止要写addRule、还写了一些别的,那看起来多乱啊。也不利于管理。

如果将来新的项目要用到相同的校验规则难道还有从app.js里面手动拷贝吗。

所以下面接着讲eggjs基于egg-validate的定制化升级

eggjs基于egg-validate的定制化升级

我们希望能达到怎么样的一个效果呢?

  1. app.js里面少写一些代码,最好就写一两行,做个配置这样子
  2. 对于所有的自定义校验规则独立出文件夹,可以取名validate,就丢在app/下面
  3. 针对相似的校验规则进一步抽象成文件,就叫做user.js这样,丢在app/validate/下面
  4. 针对某一条特定的校验规则,如校验用户的userName就丢在app/validate/user.js里面
  5. 然后保持egg-validate的使用规则不变,原来是ctx.validate现在还是ctx.vallidate。同时其他的插件、配置不受影响。这叫做代码侵入性小。
下面照着这几个目标实现代码

首先把app.js里面导入模块写出来

我们使用Loader来加载validate下面的所有文件:

const path = require('path');module.exports = app => {// 你的其它代码,balabala// 加载所有的校验规则const directory = path.join(app.config.baseDir, 'app/validate');app.loader.loadToApp(directory, 'validate');
}

然后建立实际的校验规则文件

建立app/validate/user.js文件

写入以下代码

module.exports = app =>{let { validator } = app;// 校验用户名是否正确validator.addRule('userName', (rule, value)=>{console.log(rule);if (/^\d+$/.test(value)) {return "用户名应该是字符串";}else if (value.length < 3 || value.length > 10) {console.log("用户名的长度应该在3-10之间");}});// 添加自定义参数校验规则validator.addRule('123', (rule, value) => {if (value !== '123'){return 'must be 123';}});
};

这里validator.addRule和原来一样,只是为了少写代码,之前把validator取出来了:
let { validator } = app;


这样定制化升级就完成了。之后需要再新建检验规则就写在validate里面,某一类相似校验规则要复用就直接拷贝文件就好了。

有什么问题欢迎留言评论,看到尽量会回复。。。

转载于:https://www.cnblogs.com/hengyumo/p/11134619.html

eggjs的参数校验模块egg-validate的使用和进一步定制化升级相关推荐

  1. Python参数校验工具:validate.py

    一直都在找一个比较好用的参数校验工具包(Python),这次终于找到了就做个记录. 包名:validate.py 安装方式:(pip已收入, 当前最新版本是1.3.0) pip install val ...

  2. java validate校验_自定义工具类实现validate参数校验

    前言 相信项目中做一些htttp接口,避免不了要对参数进行校验,大多数情况下,其实我们只是校验是否为NULL就可以了 1.通过注解实现各种状态的字段 1.1.引入依赖 默认的版本是6.0.9.Fina ...

  3. Spring Boot参数校验

    1. 概述 作为接口服务提供方,非常有必要在项目中加入参数校验,比如字段非空,字段长度限制,邮箱格式验证等等,数据校验常用到概念: JSR303/JSR-349: JSR303是一项标准,只提供规范不 ...

  4. SpringBoot @Validated注解实现参数校验

    1. 前言 做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的.如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量 ...

  5. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...

  6. 聊聊webflux参数校验

    为什么80%的码农都做不了架构师?>>>    序 本文主要研究下webflux如何进行参数校验 使用javax.validation domain import javax.val ...

  7. Spring Validation 最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  8. struts2教程(5)--请求参数校验

    一.请求参数校验介绍 校验的分类 :客户端数据校验 和服务器端数据校验 客户端数据校验 ,通过JavaScript完成校验 (改善用户体验,使用户减少出错 ) 服务器数据校验 ,使用框架内置校验功能( ...

  9. laravel框架中文手册_laravel请求参数校验方法

    对于后端开发而言,前端request请求中的参数校验是一个必不可少的环节.无论传来的参数是id还是email还是其他的参数,我们都要对参数的类型.大小.格式等等做这样或者那样的校验,然后才进行逻辑处理 ...

最新文章

  1. Apache JMeter2.13 实战
  2. APP超越预期效果的6种方法
  3. 启用 SR-IOV 解决 Neutron 网络 I/O 性能瓶颈
  4. 常用个人密码管理软件
  5. 02怎么取整php,php取整的几种方式
  6. BootstrapTable分页参数
  7. [转载] C#面向对象设计模式纵横谈——16 Interpreter解释器模式
  8. 2021-9-30 Python Teaching Note
  9. linux上mysql卸数_Linux下MySQL卸载和安装图文教程
  10. 前后端分离之后,如何保护你的API
  11. 日本初创公司Elix正在使用AI研究COVID-19药物
  12. 我的一些关于商业计划书的经验 (AC)
  13. pla3d打印材料密度_3D打印材料:透明PLA材料
  14. Duilib使用wke显示echarts
  15. 解决OneNote导出PDF图片模糊的问题
  16. 老九学堂C++实现小游戏之小公主养成记
  17. 树莓派系统镜像的下载和烧录
  18. java perfrences_Enterprise Resource Planning (ERP) | Oracle France
  19. 区块链凭什么改变这个世界?从它的工作原理谈起
  20. 前端开发学习笔记04---JavaScript

热门文章

  1. 如何查找BAPI SD_SALESDOCUMENT_CHANGE里字段对应的数据库存储表
  2. 虚拟机VirtualBox中Ubuntu无法全屏(终极解决方法)
  3. 利用克鲁斯卡尔算法求最小生成树
  4. php获取当前周得周一_PHP怎样获得最近一个周一和上周一的日期?
  5. 一个高质量的程序应具备哪些条件?_如何开好一个精品店?需要具备哪些条件?...
  6. java 管理员命令模式_java中命令模式详解和使用方法
  7. python解析原理_代码详解:Python虚拟环境的原理及使用
  8. java安全增加url_规范化String以在Java中创建安全URL
  9. 代码实现sql编译器_【数据蒋堂】第 19 期:从 SQL 语法看集合化
  10. 过分了,这样阅读Datasheet(数据手册)合适吗?