我正在尝试使用express-validator验证用户数据,但是当我从路由文件调用 Controller 中的用户注册方法时,页面无法加载。如果我将方法提取到 route ,它就会起作用。我想将其分开以保持项目中的一些顺序。这是我的路线文件:
import { Router } from "express";
import RegisterController from '../controllers/RegisterController';
import { body, validationResult } from "express-validator";
import pool from '../database/db';
import Hash from '../lib/bcrypt';
const router = Router();
router.get('/', (req, res) => {
res.render('home', {
title: 'Inicio',
});
});
router.get('/formulario-registro', RegisterController.index);
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;
}
});
router
.get('/formulario-login', (req, res) => {
res.render('login_form', {
title: 'Inicio de sesión'
});
});
export default router;
这是我的 Controller :
import Hash from '../lib/bcrypt';
import pool from '../database/db';
class RegisterController {
index(req, res) {
res.render('register_form', {
title: 'Registro'
});
}
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);
} else {
console.log('User registered correctly.');
}
});
res.redirect('/formulario-login');
}
}
export default new RegisterController;
提前致谢!
最佳答案
1. I think you can check your validation error in your controller and you pass your function directly to your route, this is your route file:
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.')
], RegisterController.register);
这是您的 Controller 功能:
从'../lib/bcrypt'导入哈希值; 从 '../database/db' 导入池;
class RegisterController {
index(req, res) {
res.render('register_form', {
title: 'Registro'
});
}
register(req, res) {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array()
});
}
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);
} else {
console.log('User registered correctly.');
}
});
res.redirect('/formulario-login');
}
}
export default new RegisterController;
关于javascript - 快速验证器从 Controller 调用方法时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68777616/