问题描述
我试图在用户注册时验证用户输入并测试 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;