egg中使用validate自定义校验对请求参数进行校验
官方介绍gitHub地址在获取到用户请求的参数后,不可避免的要对参数进行一些校验。插件下载npm i egg-validate --saveconfig/plugin.js配置exports.validate = {enable: true,package: 'egg-validate',};config.default.jsconfig.validate = {// 配置参数校验器,基于para
·
- 在获取到用户请求的参数后,不可避免的要对参数进行一些校验。
- 插件下载
npm i egg-validate --save
- config/plugin.js配置
exports.validate = {
enable: true,
package: 'egg-validate',
};
- config.default.js
config.validate = {
// 配置参数校验器,基于parameter
convert: true, // 对参数可以使用 convertType 规则进行类型转换
// validateRoot: false, // 限制被验证值必须是一个对象。
widelyUndefined: true
}
- convert会对入参进行转换,建议开启。举个例子,使用表单中默认的 submit 类型按钮提交表单时,提交过来的往往是序列化后的字符串,那些期望是数字类型的字段就会始终验证不过。而开启此项后,会对入参按希望的类型进行转换。
- widelyUndefined 开启后,会把空字符串,NaN,null 这些转成 undefined,将这些异常的数据进行了统一,方便后续处理。
- 新建文件 app/validate/user.js文件夹
'use strict'
module.exports = app => {
const { validator } = app
// 自定义校验规则
validator.addRule('userName', (rule, value) => {
if (value.length < 8 || value.length > 20) {
return '用户名的长度应该在8-20之间'
}
})
validator.addRule('note', (rule, value) => {
if (value.length > 100) {
return '备注不超过100字'
}
})
validator.addRule('email', (rule, value) => {
const re = RegExp(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/)
if (!re.test(value)) {
return '邮箱格式不正确'
}
})
validator.addRule('phone', (rule, value) => {
const reg = /^1[3|4|5|6|7|8][0-9]\d{8}$/
if (!reg.test(value)) {
return '手机号格式不正确'
}
})
}
- 启动时载入校验规则 app.js文件(没有则在根目录新建一个)
'use strict';
const path = require('path');
module.exports = app => {
// 加载所有的校验规则
const directory = path.join(app.config.baseDir, 'app/validate');
app.loader.loadToApp(directory, 'validate');
};
- 使用controller中
async login() {
const { ctx, service, app } = this
ctx.validate({
userName: { type: 'userName' }
})
const { userName, passWord } = ctx.request.body
const params = { passWord, userName }
app.logger.warn('111111133', ctx.request.body)
const res = await service.baseService.userService.login(params)
ctx.body = res
}
- 首先判断这个userName有没有在ctx.request.body里面,没有就跑出参数不存在、然后是userName不能为空、然后得是去app/validate/user.js去找对应的自定义规则。有一个不符合都会抛出错误。
- 默认校验的是ctx.request.body的参数。
- 另外一种写法
let errs = app.validator.validate({ userName: ‘string‘ }, ctx.request.body);
ctx.validate检验不通过会抛出异常,而app.validator.validate检验不通过会返回错误。你可以自己选择要对这个错误怎么处理,是不管呢还是返回前端
更多推荐
已为社区贡献4条内容
所有评论(0)