express校验插件,用于校验用户提交参数
npm install express-verify
原则:适用于参数文本本身的校验,比如文本长度,数字大小,是否为空这类。而需要从数据库中校验的操作,比如通过某个参数判断用户是否存在这种校验应该放在router中
import verify from 'express-verify'
// 以下配置非必须,按你的需求来
// 校验前的hook 一般用于过滤或修改某些提交参数
verify.beforeVerify = (req, res, next, router) => {
// next(Function):继续校验
// router(Function):跳过本次校验,开始执行路由
// 如果提交的name为"admin"则跳过本次校验,否则继续校验
req.body.name === 'admin' ? router() : next()
}
// 校验不通过的hook 用于配置校验不通过时的返回信息
verify.onError = (errMsg, req, res, next) => {
// errMsg:校验不通过的错误信息
// next(Function):忽略本次错误,继续执行路由
// 插件默认执行如下代码,返回错误信息。你可以在这里修改校验不通过的response
res.send({err_msg: errMsg})
}
// 校验插件获取req参数的方法配置 一般用于项目需要通过自己封装的方法获取参数
verify.paramGetter = (req, paramOn) => {
// paramOn:参数在req中的位置(body/query/params...)
return '处理后的提交参数'
})
// 配置默认校验不通过时的提示信息
verify.errMsg = YourErrMsg
推荐在当前项目根目录下创建verify文件夹,所有校验规则放在该目录
// ./verify/users.js 针对Router => users 的校验规则
import verify from 'verify'
export default {
// 添加用户 接口的校验规则
addUser: verify({
// 参数路径 body/query/params ...
body: {
// 参数名
name: {
// 通过mark参数给name一个别名 使错误提示更具体(校验不通过会返回‘姓名不能为空/姓名至少2位/姓名至多6位’)
mark: '姓名',
// 具体的校验规则
minLength: 2,
maxLength: 6
},
phone: {
// 自定义校验不通过提示
errMsg: '手机号不正确',
phone: true
}
}
})
}
import express from 'express'
// 引用校验规则
import usersVerify from '../verify/users'
var router = express.Router()
router.put('/users', usersVerify.addUser, (req, res, next) => {
// 当所有参数校验都通过后才会执行这里的代码
})
- length: 校验文本长度
- minLength: 校验文本最短长度
- maxLength: 校验文本最长长度
- maxNumber: 校验数字最大值
- minNumber: 校验数字最小值
- decimalLength: 校验小数位
- number: 校验是否为数字
- int: 校验是否为整数
- phone: 校验是否为手机号
- idCard: 校验是否为身份证号
- bankCard: 校验是否为银行卡号
- email: 校验是否为电子邮件地址
- verifyCode: 校验是否为6位数字验证码
- canBeNull: 当参数为空时跳过校验,不会执行后面的校验规则
- mustBeNull: 强制参数必须为空,不允许提交
- 用于给校验参数配置别名以替换默认校验不通过提示中的{mark}关键字。错误提示优先读取errMsg配置项,如果已经配置了errMsg就没必要mark了
- 如果没有配置mark和errMsg,将直接使用参数名作为别名
- 校验规则中出现的参数,默认都会校验不为空。如果某个参数仅仅是要校验不为空可以使用缩写:
// 假设name参数在req.body中
body: {
name: '姓名'
}
用于自定义校验不通过提示
// 假设token参数在req.body中
// 当token长度不等于10时,错误提示为:'您没有权限访问'
body: {
token: {
errMsg: '您没有权限访问',
length: 10
}
}
校验规则中出现的参数,默认都会校验不为空,该参数一般用于如下情况,比如邀请码这种一般可以为空的参数
// 假设invitationCode参数在req.body中
body: {
invitationCode: {
mark: '邀请码'
// 邀请码为空时不校验
canBeNull: true,
// 不为空时校验长度是否为6
length: 6
}
}
用于强制参数必须为空,不允许提交。可以使用缩写
// 假设id参数在req.body中
body: {
id: false
}
注意小于和小于等于的写法
// 假设number1/number2参数在req.body中
body: {
number1: {
// number1 <= 10
maxNumber: 10
},
number2: {
// number2 < 10
maxNumber: '!10'
}
}
参考maxNumber配置
如果自带的校验方法满足不了您的需求,可以在校验规则中插入您自己的校验方法
// 假设id参数在req.body中
body: {
id: {
length: 24,
verify (val) {
// val为id参数的提交值
// 可以直接return校验不通过的提示
// if (val.substr(0,2) !== 'id') return 'id格式不正确'
// 如果直接return true/false 校验不通过提示将使用errMsg或默认错误提示
// return val.substr(0,2) === 'id'
}
}
}
除了使用插件默认参数获取或配置全局paramGetter外,如果需要针对某个校验规则单独处理参数获取,可以给主函数传入自定义参数获取方法
// ./verify/users.js 针对Router => users 的校验规则
import verify from 'verify'
export default {
// verifyRule: 参考上文的校验规则示例
addUser: verify(verifyRule, {
body (req) {
return '您处理后的body中的所有参数'
},
query (req) {
return '您处理后的query中的所有参数'
}
})
}
校验前的hook 一般用于过滤或修改某些提交参数。参考上文 全局配置
校验不通过的hook 一般用于配置校验不通过时的返回信息。参考上文 全局配置
校验插件获取req参数的方法配置 一般用于项目需要通过自己封装的方法获取参数。参考上文 全局配置
本插件校验的核心方法来自verify-base
// 通过该方式获取verifyBase以使用其内置的各种校验方法
console.log(verify.verifyBase('int')(0.5))
// 拓展校验规则,具体可参考上方verify-base文档
// 拓展之后你就可以像使用自带的校验规则(如:phone,number)那样使用你的yourRuleName
verify.verifyBase('yourRuleName', (val, rule) => {
// 校验逻辑
return '校验不通过'
})
插件的默认校验不通过提示模版
{
number: {
common: '{mark}应为数字',
// >
maxNumber: '{mark}不能大于{maxNumber}',
// >=
maxNumber2: '{mark}应小于{maxNumber}',
// <
minNumber: '{mark}不能小于{minNumber}',
// <=
minNumber2: '{mark}应大于{minNumber}',
decimalLength: '{mark}最多为{decimalLength}位小数'
},
// 特殊类型
int: '{mark}仅接受整数',
phone: '手机号不正确',
idCard: '身份证号不正确',
bankCard: '银行卡号不正确',
verifyCode: '验证码错误',
email: '邮箱格式不正确',
common: {
empty: '{mark}不能为空',
length: '{mark}必须为{length}位',
minLength: '{mark}至少{minLength}位',
maxLength: '{mark}至多{maxLength}位',
mustBeNull: '{mark}参数不允许'
}
}
您可以按照上述格式自定义您的错误提示
verify.errMsg = {}
也可以只修改某些项
verify.errMsg.int = '{mark}必须为整数'
用于批量给校验规则添加canBeNull属性 rules: 待处理的校验规则 options: 自定义处理规则
var rules = {
body: {
name: '姓名',
age: {
mark: '年龄'
int: true,
maxNumber: 20
}
}
}
// 为rules批量添加canBeNull属性,并传入自定义处理规则
verify.canBeNull(rules, {
body: {
// 添加sex参数的校验
sex: {
mark: '性别',
canBeNull: true
},
// 覆盖age参数的校验
age: {
mark: '年龄'
int: true,
maxNumber: 21
}
}
})
// 返回
{
body: {
name: {
mark: '姓名',
canBeNull: true
},
age: {
mark: '年龄'
int: true,
maxNumber: 21
},
sex: {
mark: '性别',
canBeNull: true
}
}
}