Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
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;//Экспортирум роутер