使用express-validator时调用controller方法页面无法加载如何解决?
问题原因
路由文件中验证通过后,仅引用了RegisterController.register方法对象,没有实际执行该方法也没有传递req、res参数,导致请求一直处于待响应状态,表现为页面无法加载。
修复方案
1. 修改路由文件的POST /register逻辑
找到路由文件中/register POST路由的else分支,修改为如下代码:
} else { // 调用register方法并传入req、res参数 RegisterController.register(req, res); }
修改后的完整路由片段参考:
router.post('/register', [ body('username') .notEmpty() .withMessage('El nombre de usuario no debe quedar vacío.'), body('email') .notEmpty() .withMessage('El email no debe quedar vacío') .isEmail() .withMessage('El email debe de tener un formato correcto.'), body('password') .notEmpty() .withMessage('La contraseña no debe de quedar vacía.') .isLength({ min: 8 }) .withMessage('La contraseña debe de tener 8 caracteres como mínimo.') .custom((value, { req }) => { if (value !== req.body.confirm__password) { return false; } else { return true; } }) .withMessage('Las contraseñas deben coincidir.') ], (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } else { RegisterController.register(req, res); } });
2. 可选优化:调整controller异步逻辑
当前controller中的数据库查询是异步操作,现有代码会在数据库操作未完成时就执行跳转,可能出现注册失败但仍然跳转的问题,建议将跳转逻辑放到数据库回调中:
register(req, res) { const sql = 'INSERT INTO contact_app.users (username, email, password) VALUES (?, ?, ?)'; pool.query(sql, [req.body.username, req.body.email, Hash.encryptPass(req.body.password)], (err) => { if (err) { console.error(err); return res.status(500).json({ message: '注册失败,请重试' }); } console.log('User registered correctly.'); res.redirect('/formulario-login'); }); }
内容的提问来源于stack exchange,提问作者Álvaro
相关产品推荐
相关产品推荐

