应用场景
在后端实现用户注册功能的时候,如果手机号或者邮箱已经被注册,我们应该进行检验的提示,在node的express框架中,我们就需要这个中间件俩解决
安装中间件
首先使用命令安装express-validator中间件
npm install --save express-validator
封装验证规则错误处理文件
我们需要编写一个文件用来封装打印输出错误信息,这里新建一个名为middleware的文件夹,用来存放中间件,文件夹下新建errorBack.js来进行编写:
- 首先从express-validator中引入validationResult
- 使用Promise.all将我们写的验证规则挨个进行循环,然后调用validate.run()方法挨个进行验证。
- 验证完后如果有错误进行处理返回结果,没有错误则使用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用来编写用户相关验证的内容
- 首先从express-validator引入body,从上面写的errorBack文件中引入validate
const {
validationResult, body } = require('express-validator')
const validate = require('./errorBack')
- 想验证谁就在body后写谁,不能为空就是.notEmpty()方法,如果验证满足就用.withMessage进行自定义提示内容,.isLength就是判断长度的验证,.bail()方法是如果当前验证通过,才继续往下执行。例如:
body('username')
.notEmpty().withMessage('用户名不能为空').bail()
.isLength({
min: 3 }).withMessage('用户名长度不能小于3').bail(),
- 因为上面将封装了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(),
下面使用相同手机号我们进行注册测试:
就会提示如下信息
这样我们就完成了提交数据的校验,如果邮箱和手机号已经注册,我们就会返回提示响应的错误信息,这样的场景很多,只要提交的数据需要校验,我们都可以这样封装进行操作~