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

Mic*_*ala 3 express express-validator

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

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

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

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

Run Code Online (Sandbox Code Playgroud)
//route.js
import express from 'express';
import usersController from './controller';

const router = express.Router();

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

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

Run Code Online (Sandbox Code Playgroud)
//validator.js
import { check } from 'express-validator/check';

module.exports = [check('email').isEmail()];
Run Code Online (Sandbox Code Playgroud)

我希望在名为 validator.js 的文件中实现验证,例如,在插入数据库之前验证电子邮件

Shi*_*rma 29

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

使用路由.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;
Run Code Online (Sandbox Code Playgroud)

用户验证器.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();
  },
];
Run Code Online (Sandbox Code Playgroud)

控制器.js

/**
 * @desc    - create new User
 * @method  - POST
 */
exports.createCategory = async (req, res) => {
  //  do your stuff here. (No need to check any validation error here)
}
Run Code Online (Sandbox Code Playgroud)


dim*_*nes 6

这是我使用 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];
Run Code Online (Sandbox Code Playgroud)

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

route.js

//

router.post('/createuser', validator.createUser, usersController.createUser);
Run Code Online (Sandbox Code Playgroud)

最后,在您的控制器中,您必须在需要validationResult.

控制器.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.

}
Run Code Online (Sandbox Code Playgroud)

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


Car*_*_E. 5

我在异步函数方面遇到了一些问题,这是我简陋的解决方案,希望这对某人有所帮助:

路线定义

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

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

router.post('/users', userValidator.add, userController.add);
Run Code Online (Sandbox Code Playgroud)

验证器

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
    ]
};
Run Code Online (Sandbox Code Playgroud)