асинхронный валидатор

validator/validator.js

const {body, validationResult} = require('express-validator');//валидая работающая с express
const User = require('../models/user');//Модель User
 
 
/**
 * Название валидатора произвольное
 * @type {*[]}
 */
exports.registerValidators = [
  body('email')
      .isEmail().withMessage('Введите корректный email')//ПРоверка email
      .custom(async (value, {req})=>{//Асинхронный валидатор, проверка на существование такого email  в базе
            try{
                const user = await User.findOne({//поиск пользователя
                    email: value
                });
                if(user){
                    return Promise.reject('Такой email уже существует');//возврощаем промис чтоб остальные методы ждали его выполнение
                }
            }catch(e){
                console.log(e);
            }
        }),
  body('password','минимум 6 символов').isLength({min: 6, max: 56}).isAlphanumeric().withMessage('Только цифры и латинские буквы'),
  body('confirm').custom((valuem, {req}) => {//Кастомный валидатор
      if(valuem !== req.body.password){//Проверяем совподают ли значения при подтверждении пароля
          throw new Error('Пароль должен совпадать');
      }
      return true
  })
  //body('name').isLength({min: 3}).withMessage('Минимум три символа')//Имя пользователя
];

routes/auth.js

const {Router} = require('express');//модуль express
const bcrypt = require('bcryptjs');//Модуль шифрования
const User = require('../models/user');//модель пользователя
const nodeMailer = require('nodemailer');//mailer
const sendGrid = require('nodemailer-sendgrid-transport');//Транспорт для mailer
const config = require('../config/config');//конфигурация
const regMail = require('../emails/registration');//конфигурация для почтовой рассылки
const resetMail = require('../emails/reset');//конфигурация для почтовой рассылки
const crypto = require('crypto');//Встроеннная в node.js криптографическая библиотека
const {validationResult} = require('express-validator');//валидация работающая с express
const {registerValidators} = require('../validator/validator');//middleware - мой валидатор на основе express-validator
const router = Router();//инициируем роутер
 
 
/**
 * Регистрация пользователя
 * первый параметр адрес страницы, в данном случае используется префикс при регистрации ройтера,
 * второй параметр валидация
 * второй параметр callback - обработчик запроса req - request , запрос от браузера
 * res - response, ответ сервера
 */
router.post('/register', registerValidators,async (req, res) => {
       const {email, password, name} = req.body;//получить данные пользоватедя
 
       const error = validationResult(req);//получить результирующую ошибку если она есть
 
       if(!error.isEmpty()){//если ошибка присутствует
           req.flash('error', error.array()[0].msg);//сохранить ошибку в сессии
           return res.status(422).redirect('/auth/login#register');//редирект на страницу регистрации
                   //, 422 -код ошибки валидации
       }
       const hashPassword = await bcrypt.hash(password, 10);//Шифруем пароль
       const user = new User({email, name, password:hashPassword, cart: {items:[]}});//создание пользователя
       await user.save();//сохраняем запись
 
       await transporter.sendMail(regMail(email));//отправить mail, Рекомендуется использовать после редиректов
 
       res.redirect('/auth/login#login');
 
 
    }
);
 
 
module.exports = router;//Экспортирум роутер