alex4answ
@alex4answ

Где правильно разместить валидатор POST?

Добрый день, использую express-validator, не могу решить где лучше разместить валидатор.
Использую такой подход:
Router

middleware уже не встроить.
const router  = express.Router();
const userController = require('./userController');

router.route('/')
  .get(userController.getAll)
  .post(userController.create);

Controller:
exports.create = async (req, res, next) => {
  const validator = require('./validators/userCreate'); // Чтобы грузить только при создании
  await validator(req, res);

  try {
    const user = await userService.create(req.body);
    res.status(201).json(user);
  } catch(err) {
    res.status(422).json({ message: err.message });
  }
};

Чтобы валидатор загружался только при создании, я его запрашиваю (require) в конкретном экшене контроллера.
Сам валидатор
const { body, validationResult } = require('express-validator');
modules.exports = validate([ body('email').isEmail(), body('name').isString() ]);

const validate = (validators) => { // хранится в utils, тут для наглядности
  return async (req, res) => {
    await Promise.all(validators.map((validator) => validator.run(req)));

    const errors = validationResult();
    if (!errors.isEmpty) {
      res.status(422).send({ errors: errors.array() });
    } 
     // будь это полноценным middleware, тут было бы next()
  }
};


Все сомнения сводятся к тому, что мой валидатор это вроде и middleware, но разместить его в цепочке я не могу, потому что валидаторы бывают очень объемными и хочется загружать их только при нужном экшене.

На сколько удачно мое решение, или как подобные вещи реализуются?
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы