express-validator 从控制器调用方法的问题

Problem with express-validator calling a method from controller

我正在尝试使用 express-validator 验证用户数据,但是当我从路由文件调用控制器中的用户注册方法时,页面没有加载。如果我将方法提取到路由中,它就可以工作。我想将它分开以在我的项目中保持一些顺序。这是我的路线文件:

    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;

这是我的控制器:

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);

这是您的控制器功能:

从'../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;