egg-validate-plus(参数校验基于async-validator)
# 安装
npm i egg-validate-plus --save
1
# 配置插件
{app_root}/config/plugin.{env}.js
:
exports.validatePlus = {
enable: true,
package: 'egg-validate-plus',
};
1
2
3
4
2
3
4
{app_root}/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: '参数错误',
};
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 使用
# 目录结构
|- 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 传入字符串
// app/controller/xx.js
const { query } = this.ctx.request;
// 拿到验证结果 rules/user/login.js,第一个参数对应rules目录下的目录或文件
const valid = await this.ctx.validate('user.login', query)
// 验证不通过时,阻止后面的代码执行
if (!valid) return
1
2
3
4
5
6
7
2
3
4
5
6
7
# 直接传入验证规则对象
// 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 添加规则文件
rules/user/login.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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
上次更新: 2023/09/22, 16:54:32