企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ### egg-validate-plus 使用 文档:https://github.com/temool/egg-validate-plus `rules`中规则的编写,参见[async-validator](https://github.com/yiminghe/async-validator)中验证规则的编写 ### 开启插件 ~~~ // config/plugin.{env}.js exports.validatePlus = { enable: true, package: 'egg-validate-plus', }; ~~~ ### 配置插件 ~~~ // config/config.{env}.js config.validatePlus = { resolveError(ctx, errors) { if (errors.length) { ctx.type = 'json'; ctx.status = 400; ctx.body = { code: 400, error: errors, message: '参数错误', }; } } }; ~~~ ### 使用插件 ~~~ |- MY-PROJECT |- app |- controller |- user.js |- post.js |- rules |- user |- login.js [用户登录参数校验规则] |- post |- add.js [创建 post 参数校验规则] |- config |- config.default.js |- plugin.js |- package.json |- README.md ~~~ #### 规则的传入方式 ##### [](https://github.com/temool/egg-validate-plus#1传入字符串)1.传入字符串 ~~~js // app/controller/xx.js const { query } = this.ctx.request; // 拿到验证结果 const validateResult = await this.ctx.validate('user.login', query) // 验证不通过时,阻止后面的代码执行 if (!validateResult) return ~~~ 注意:不要带上 rules ##### [](https://github.com/temool/egg-validate-plus#2直接传入验证规则对象)2.直接传入验证规则对象 ~~~js // app/controller/xx.js // 直接引入 rules 文件下的验证规则,也可以是自己写的验证规则对象 const rule = this.app.rules.user.login // 数据格式 // const rule = { // id: [ // { required: true }, // { type: 'number', message: 'id 必须为数字 } // ], // password: [ // { required: true }, // { type: 'string', message: 'password 必须为字符串 } // ] // } // 从客户端传入的参数 const { query } = this.ctx.request; // 数据格式: // query = { // username: 123456, // password: 'abcdefg' // } // 拿到验证结果 const validateResult = await this.ctx.validate(rule, query) // 验证不通过时,阻止后面的代码执行 if (!validateResult) return ~~~ #### 添加signIn.js规则 ``` 'use strict'; const rule = { email: [ { required: true, message: '邮箱不能为空' }, { type: 'email', message: '邮箱格式不正确' }, ], password: [ { required: true, message: '密码不能为空' }, { type: 'string', message: '密码字段需要是字符串' }, { // eslint-disable-next-line no-unused-vars validator(rule, value, callback, source, options) { const pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$/; if (pattern.test(value)) { callback(); // 验证通过 return; } callback({ message: '密码最少包含一个大小写字母、数字并且为8-16位' }); // 验证不通过 }, }, ], }; module.exports = rule; ``` #### controller中login.js使用 ``` 'use strict'; const Controller = require('egg').Controller; class LoginController extends Controller { async loginIn() { const { ctx, app } = this; const { email, password } = ctx.request.body; const validateResult = await ctx.validate('login.signIn', { email, password }); // 第一个参数对应于rules目录下目录或文件 if (!validateResult) { return; } const loginInfo = await ctx.service.user.login({ password, email }); // 省略部分代码 ctx.returnBody(200, '登录成功', loginInfo.userId); // returnBody方法是基于context的扩展 } } module.exports = LoginController; ``` #### context.js扩展 ``` 'use strict'; module.exports = { returnBody(status, message, data = null) { this.status = status; this.body = { message, data, flag: true, }; }, }; ```