Добрый день, использую
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, но разместить его в цепочке я не могу, потому что валидаторы бывают очень объемными и хочется
загружать их только при нужном экшене.
На сколько удачно мое решение, или как подобные вещи реализуются?