使用express-validator中间件,实现客户端提交数据的安全校验

应用场景

在后端实现用户注册功能的时候,如果手机号或者邮箱已经被注册,我们应该进行检验的提示,在node的express框架中,我们就需要这个中间件俩解决

安装中间件

首先使用命令安装express-validator中间件

npm install --save express-validator

封装验证规则错误处理文件

我们需要编写一个文件用来封装打印输出错误信息,这里新建一个名为middleware的文件夹,用来存放中间件,文件夹下新建errorBack.js来进行编写:

  1. 首先从express-validator中引入validationResult
  2. 使用Promise.all将我们写的验证规则挨个进行循环,然后调用validate.run()方法挨个进行验证。
  3. 验证完后如果有错误进行处理返回结果,没有错误则使用next()继续往下
const {
    
     validationResult } = require('express-validator')
module.exports = validator => {
    
    
  return async (req, res, next) => {
    
    
    await Promise.all(validator.map(validate => validate.run(req)))
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
    
    
      return res.status(401).json({
    
     error: errors.array() })
    }
    next()
  }
}

封装验证业务的文件

middleware文件夹下新建一个userValidator.js用来编写用户相关验证的内容

  1. 首先从express-validator引入body,从上面写的errorBack文件中引入validate
const {
    
     validationResult, body } = require('express-validator')
const validate = require('./errorBack')
  1. 想验证谁就在body后写谁,不能为空就是.notEmpty()方法,如果验证满足就用.withMessage进行自定义提示内容,.isLength就是判断长度的验证,.bail()方法是如果当前验证通过,才继续往下执行。例如:
body('username')
    .notEmpty().withMessage('用户名不能为空').bail()
    .isLength({
    
     min: 3 }).withMessage('用户名长度不能小于3').bail(),
  1. 因为上面将封装了validate,所以我们需要把验证的规则当做参数传入到validate中:
module.exports.register = validate([
  body('username')
    .notEmpty().withMessage('用户名不能为空').bail()
    .isLength({
    
     min: 3 }).withMessage('用户名长度不能小于3').bail(),
  body('email')
    .notEmpty().withMessage('邮箱不能为空').bail()
    .isEmail().withMessage('邮箱格式不正确').bail()
])

在路由中调用封装的方法

封装完成之后我们就能直接在路由进行使用了

router.post('/registers',validator.register,userController.register)

现在我们进行请求,查看效果:
使用错误格式的邮箱进行注册就会返回如下信息
在这里插入图片描述
如果我们想要判断是否是已经注册过的手机号(邮箱同理),则需要进行一下改动,需要查找数据库是否存在当前手机号,所以在验证规则中新增查找:
这里的User是我封装的数据库中用户的数据模型

body('phone')
    .notEmpty().withMessage('手机号不能为空').bail()
    .custom(async val => {
    
    
      const phoneValidate = await User.findOne({
    
     phone: val })
      if (phoneValidate) {
    
    
        return Promise.reject('手机号已被注册')
      }
    }).bail(),

下面使用相同手机号我们进行注册测试:
就会提示如下信息
在这里插入图片描述
这样我们就完成了提交数据的校验,如果邮箱和手机号已经注册,我们就会返回提示响应的错误信息,这样的场景很多,只要提交的数据需要校验,我们都可以这样封装进行操作~

猜你喜欢

转载自blog.csdn.net/weixin_45745641/article/details/127483540