javascript - 快速验证器从 Controller 调用方法时出现问题

标签 javascript node.js express express-validator

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

相关文章:

javascript - 否定后视不匹配转义字符,在转义反斜杠上失败

javascript - <object> 由从 $(document).ready 调用的函数创建,未呈现

javascript - 无法在 Angular 4 中通过 HTTP 发送 POST 请求

node.js - 服务器端和胖客户端 Web 应用程序的文件夹结构

node.js - 使用 mongoose 版本(4.11.0)连接到 Mongo DB

node.js - Dropbox api V2,在查询参数中获取访问 token 而不是 url 哈希 (#) (Nodejs)

javascript - 在 JavaScript 中以编程方式选择文本

node.js - JOI.validate() 不允许 "dataValues"

node.js - Node js 中的实体太大(Express.js 版本为 4.16.1)

node.js - Node.js 中的响应大小是否有大小限制