【问题标题】:Problem with express-validator calling a method from controller快速验证器从控制器调用方法的问题
【发布时间】:2021-08-13 19:39:12
【问题描述】:

我正在尝试使用 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;

提前致谢!

【问题讨论】:

    标签: javascript node.js express express-validator


    【解决方案1】:

    1.我认为您可以在控制器中检查您的验证错误,然后将您的函数直接传递给您的路由,这是您的路由文件:

    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;
    

    【讨论】:

    • 我试过这个,但是post请求永远不会结束。
    • 你可以在你的控制器中使用 res.send({})
    • 好的... Somw它对我有用。有什么方法可以将验证放在一个单独的文件中以保持路线尽可能干净?
    • 是的,我认为它可以帮助你 Alvaro,stackabuse.com/…
    • 太棒了。完美运行...谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多