如何使用express-validator在单独的文件中实施验证

时间:2019-04-20 10:15:18

标签: express express-validator

我正在尝试使用express-validator验证req.body,然后再发送将数据插入postgres的发布请求。

我有一个路由文件,控制器文件,我想在一个名为validate.js的文件中进行验证。同时,我安装了express-validator并将其导入到server.js中。我遇到的其他资源似乎在包含插入数据逻辑的函数中实现了验证。

//server.js
....
import expressValidator from 'express-validator';

...
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator);

//route.js
import express from 'express';
import usersController from './controller';

const router = express.Router();

router.post('/createuser', usersController.createUser);

//controller.js
createUser(req, res){
 ...
const { firstName, lastName, email, password } = req.body;
//code to insert user details to the database
}

//validator.js
import { check } from 'express-validator/check';

module.exports = [check('email').isEmail()];

我希望在一个名为validateator.js的文件中实现验证,以便在插入数据库之前验证电子邮件

3 个答案:

答案 0 :(得分:15)

我有相同的方法,除了一件事是我们不应该在控制器中处理验证错误。因此,如果验证层发生任何错误,则应仅从那里返回。我们不应该允许我们的控制流进入控制器层。因此,下面是代码示例:

useRoute.js

def create(event):
    new_window_2 = Toplevel(window)
    new_window_2.geometry('500x600')
    owner_comb_data = tk.StringVar()    
    owner_combo = ttk.Combobox(new_window_2,width = 20,textvariable = owner_comb_data, values = owners)
    owner_combo.set("OWNER")
    owner_combo.grid(column = 1, row =1, padx=10,pady=10)

userValidator.js

const route = express.Router();

const {
  **validateUser**,
} = require('../middlewares/validators/userValidator');

route.route('/').post(**validateUser**, createUser);
route.route('/:id').put(**validateUser**, updateUser);

module.exports = route;

controller.js

const {check, validationResult} = require('express-validator');

exports.validateUser = [
  check('name')
    .trim()
    .escape()
    .not()
    .isEmpty()
    .withMessage('User name can not be empty!')
    .bail()
    .isLength({min: 3})
    .withMessage('Minimum 3 characters required!')
    .bail(),
  check('email')
    .trim()
    .normalizeEmail()
    .not()
    .isEmpty()
    .withMessage('Invalid email address!')
    .bail(),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty())
      return res.status(422).json({errors: errors.array()});
    next();
  },
];

答案 1 :(得分:0)

这是我使用express-validator的方式。我有一个文件validator.js,其中有许多路由的验证逻辑。例如:

validator.js

const { check } = require('express-validator/check');

exports.createUser = [check('email').isEmail()];

exports.anotherRoute = [// check data];

exports.doSomethingElse = [// check data];

现在在您的路由文件中,您需要validator.js文件
const validator = require("./validator"); // or where your file is located
并将所需的验证逻辑用作中间件。例如:

route.js

//

router.post('/createuser', validator.createUser, usersController.createUser);

最后,在需要validationResult之后,您必须在控制器内部检查在验证期间创建的可能错误。

controller.js

const { validationResult } = require('express-validator/check');


exports.createUser(req, res) {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.array() });
    }
    // do stuff here.

}

此外,您不必在server.js文件中使用app.use(expressValidator);

答案 2 :(得分:0)

我在使用异步功能时遇到了一些问题,这是我的谦虚解决方案,希望对您有所帮助:

路由定义

const router = require('express').Router();

const userValidator = require('./Validators/UserValidator');
const userController = require('./Controllers/UserController');

router.post('/users', userValidator.add, userController.add);

验证者

const { check, validationResult } = require('express-validator');

const generateValidators = () => [
    check('first_name')...,
    
    check('last_name')...,
    
    check('email')...,
    
    check('password')...
]

const reporter = (req, res, next) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        const errorMessages = errors.array().map(error => error.msg);
        
        return res.status(400).json({
            errors: errorMessages
        });
    }
    
    next();
}

module.exports = {
    add: [
        generateValidators(),
        reporter
    ]
};