express-verify

express校验插件,用于校验用户提交参数

Usage no npm install needed!

<script type="module">
  import expressVerify from 'https://cdn.skypack.dev/express-verify';
</script>

README

express-verify

express校验插件,用于校验用户提交参数

安装

npm install express-verify

使用

原则:适用于参数文本本身的校验,比如文本长度,数字大小,是否为空这类。而需要从数据库中校验的操作,比如通过某个参数判断用户是否存在这种校验应该放在router中

一,在./app.js中执行全局配置

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

二,针对每个router创建校验规则文件

推荐在当前项目根目录下创建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
      }
    }
  })
}

三,具体的router中引用对应的校验规则

import express from 'express'
// 引用校验规则
import usersVerify from '../verify/users'
var router = express.Router()
router.put('/users', usersVerify.addUser, (req, res, next) => {
  // 当所有参数校验都通过后才会执行这里的代码
})

支持的校验规则(继承verify-base.js)

  • length: 校验文本长度
  • minLength: 校验文本最短长度
  • maxLength: 校验文本最长长度
  • maxNumber: 校验数字最大值
  • minNumber: 校验数字最小值
  • decimalLength: 校验小数位
  • number: 校验是否为数字
  • int: 校验是否为整数
  • phone: 校验是否为手机号
  • idCard: 校验是否为身份证号
  • bankCard: 校验是否为银行卡号
  • email: 校验是否为电子邮件地址
  • verifyCode: 校验是否为6位数字验证码
  • canBeNull: 当参数为空时跳过校验,不会执行后面的校验规则
  • mustBeNull: 强制参数必须为空,不允许提交

重要校验参数说明

mark

  • 用于给校验参数配置别名以替换默认校验不通过提示中的{mark}关键字。错误提示优先读取errMsg配置项,如果已经配置了errMsg就没必要mark了
  • 如果没有配置mark和errMsg,将直接使用参数名作为别名
  • 校验规则中出现的参数,默认都会校验不为空。如果某个参数仅仅是要校验不为空可以使用缩写:
// 假设name参数在req.body中
body: {
  name: '姓名'
}

errMsg

用于自定义校验不通过提示

// 假设token参数在req.body中
// 当token长度不等于10时,错误提示为:'您没有权限访问'
body: {
  token: {
    errMsg: '您没有权限访问',
    length: 10
  }
}

canBeNull

校验规则中出现的参数,默认都会校验不为空,该参数一般用于如下情况,比如邀请码这种一般可以为空的参数

// 假设invitationCode参数在req.body中
body: {
  invitationCode: {
    mark: '邀请码'
    // 邀请码为空时不校验
    canBeNull: true,
    // 不为空时校验长度是否为6
    length: 6
  }
}

mustBeNull

用于强制参数必须为空,不允许提交。可以使用缩写

// 假设id参数在req.body中
body: {
  id: false
}

maxNumber

注意小于和小于等于的写法

// 假设number1/number2参数在req.body中
body: {
  number1: {
    // number1 <= 10
    maxNumber: 10
  },
  number2: {
    // number2 < 10
    maxNumber: '!10'
  }
}

minNumber

参考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'
    }
  }
}

自定义body/query/params..参数获取方法

除了使用插件默认参数获取或配置全局paramGetter外,如果需要针对某个校验规则单独处理参数获取,可以给主函数传入自定义参数获取方法

// ./verify/users.js 针对Router => users 的校验规则
import verify from 'verify'
export default {
  // verifyRule: 参考上文的校验规则示例
  addUser: verify(verifyRule, {
    body (req) {
      return '您处理后的body中的所有参数'
    },
    query (req) {
      return '您处理后的query中的所有参数'
    }
  })
}

属性

beforeVerify

校验前的hook 一般用于过滤或修改某些提交参数。参考上文 全局配置

onError

校验不通过的hook 一般用于配置校验不通过时的返回信息。参考上文 全局配置

paramGetter

校验插件获取req参数的方法配置 一般用于项目需要通过自己封装的方法获取参数。参考上文 全局配置

verifyBase

本插件校验的核心方法来自verify-base

// 通过该方式获取verifyBase以使用其内置的各种校验方法
console.log(verify.verifyBase('int')(0.5))
// 拓展校验规则,具体可参考上方verify-base文档
// 拓展之后你就可以像使用自带的校验规则(如:phone,number)那样使用你的yourRuleName
verify.verifyBase('yourRuleName', (val, rule) => {
  // 校验逻辑
  return '校验不通过'
})

errMsg

插件的默认校验不通过提示模版

{
  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 = {})

用于批量给校验规则添加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
    }
  }
}