Express-validator 验证时不返回任何错误

问题描述

我试图在用户注册时验证用户输入并测试 express-validator 中是否产生错误,然后再将其保存到数据库中。我期望在提交空表单或填写与预期输入不匹配的内容时会产生错误(例如电子邮件必须是有效的电子邮件)。但是,经过多次尝试,并检查了之前发布的不同问题,我仍然不明白为什么中间件不起作用。

routes/index.js代码

app.post('/signup',authenticated,userController.validateNewUser,(req,res) => { // Validate temp
  const errors = validationResult(req);
  console.log(req.body);
  console.log(errors);
  console.log(errors.array());
  if (!errors.isEmpty()) {
     return res.send( {errors: errors.array(),message: "Error"} );
  } else {
     // this gets executed since there are no errors apparently
     return res.send( {message: "OK"} );
  }   
});

注意:我在文件上方有一个 const{validationResult} = require('express-validator');

userController.validateNewUser 中的 controllers/userController.js 代码

validateNewUser: [
  body('firstName')
  .exists()
  .not().isEmpty().withMessage('Cannot be empty')
  .isLength({ min:2,max:20 }).withMessage('First Name must be between 2 to 20 letters.')
  .isAlpha().withMessage('First Name must contain letters.'),body('lastName')
  .exists()
  .not().isEmpty()
  .isLength({ min:2,max:20 }).withMessage('Last Name must be between 2 to 20 letters')
  .isAlpha().withMessage('Last Name must contain letters.'),body('email')
  .exists()
  .not().isEmpty()
  .isEmail().withMessage('Email must be a valid email.'),]

注意:我在文件上方有一个 const{body} = require('express-validator');

输出 执行代码时,用空字段填充表单,它不会产生错误

{
  firstName: '',lastName: '',email: '',password: '',confirmPassword: ''
}
Result { formatter: [Function: formatter],errors: [] }
[]

即使我填写了一些东西(req.body 不为空),它也不会产生任何错误

{
  firstName: 'fllllllllllllllllllllllll',lastName: 'k',password: 'dd',confirmPassword: 'ddd'
}
Result { formatter: [Function: formatter],errors: [] }
[]

与之前的问题不同,这些问题要么是由于没有包含 validationResult(req)获取错误,要么是由于 check 中间件没有被正确使用,代码实际上经历了整个验证过程,但没有捕获错误。它运行良好,实际上根本不会产生任何错误。我目前不知道是什么导致了这个问题以及如何解决它。以前可以用,但在修改了一些代码后,由于某种原因停止了。

解决方法

这是一个有效的验证示例。

在我的示例中,我使用了 notEmpty() function

const { body,validationResult } = require('express-validator');

exports.validationBodyRules = [
    body('login','login is required').exists(),body('password','password is required').exists(),body('login','login is required').notEmpty(),'password is required').notEmpty()
];

exports.checkRules = (req,res,next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }
    next();
};

这是我用于验证链接的路由器函数。

const router = require('express').Router();
const loginService = require('../controllers/login.controller');
const loginValidator = require('../validators/login.validator');

router.post('/login',loginValidator.validationBodyRules,loginValidator.checkRules,loginService.hashPassword,loginService.lookupLogin,loginService.logEmployee);

module.exports = router;