Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
const express = require('express');//Подключаем модуль const path = require('path');//Модуль для работы с путями к файлам и папкам const csrf = require('csurf');//CSRF - защита (Cross-Site Request Forger) const flash = require('connect-flash');//серверные сообщения const exphbs = require('express-handlebars');//Подключаем шаблонизатор const db = require('mongoose'); //библиотека для mongodb const session = require('express-session');//модуль для создания сессий, в express const MongoStore = require('connect-mongodb-session')(session);//Реквайр возвращает функцию которую мы сразу вызываем, // куда мы передаем пакет session, который используем для синхронизации. Вернет класс const config = require('./config/config'); //конфиг с url к БД, и секретным ключом const varMiddleware = require('./middleware/variables');//модуль проверки авторизации const userMiddleware = require('./middleware/user');//модуль инициализации авторизованного пользователя const app= express();//Результат работы модуля express, по сути создает сервер const PORT = process.env.PORT || 3000; //Получить порт из переменного окружения или использовать дефолтный const store = new MongoStore({//создаем коллекцию в БД collection: 'sessions',//Название коллекции uri: config.mongoURI//коннект }); /** * Подключаем роуты */ const homeRoutes = require('./routes/home');//главная страница const coursesRoutes = require('./routes/courses');//Страница courses const addRoutes = require('./routes/add');//Страница add const aboutRoutes = require('./routes/about');//Страница about const cardRoutes = require('./routes/card');//Страница about const ordersRoutes = require('./routes/orders');//Страница about const authRoutes = require('./routes/auth');//Страница auth const hbs= exphbs.create({//Настройки шаблонизатора defaultLayout: 'main',//Шаблон по умолчанию, основной, (template/layouts/main.hbs) extname: 'hbs' //Расширение шаблонов, пользовательское. По умолчанию express-handlebars }); app.engine('hbs', hbs.engine);//Подключени шаблонизатора к express, регестрируем движок app.set('view engine', 'hbs');//Запускаем шаблонизатор, используем app.set('views', 'template');//Указываем папку с шаблонами app.use(express.static(path.join(__dirname,'public')));//Статические папки для хранения стилей картинок app.use(express.urlencoded({extended: true})); app.use(session({//инициализация сессии secret: 'key secret',//секретный ключ для сессии resave: false, saveUninitialized: false, store: store //передаем объект })); app.use(csrf());//Включение CSRF защиты (Cross-Site Request Forger), подключать нужно после сессии app.use(flash());//серверные сообщения, подключать нужно после сессии app.use(varMiddleware);//middleware - срабатывает при загруке страницы, данный метод проверяет авторизацию middleware/variables.js app.use(userMiddleware);//middleware - срабатывает при загруке страницы, инициализируем авторизованного пользователя /** * Регестрируем роуты, с префиксами */ app.use('/', homeRoutes);//Главная страница app.use('/courses',coursesRoutes);//страница courses app.use('/add',addRoutes);//страница add app.use('/about',aboutRoutes);//Страница about app.use('/card',cardRoutes);//Страница корзина app.use('/orders',ordersRoutes);//Страница заказов app.use('/auth',authRoutes);//Страница заказов /** * Запуск сервера * @returns {Promise<void>} */ async function start(){ try{ await db.connect(config.mongoURI,{//подключение к БД useNewUrlParser: true, useFindAndModify: false }); console.log('MongoDB has started ...'); app.listen(PORT, () => {//Слушать 3000 порт console.log(`server is running on port ${PORT}`); }); } catch(e){ console.log(e);//Ксли коннект не удался; } } start();
const {Router} = require('express');//модуль express const bcrypt = require('bcryptjs');//Модуль шифрования const User = require('../models/user');//модель пользователя const router = Router();//инициируем роутер /** * Страница /auth/login */ router.get('/login',(req, res) => { res.render('auth/login',{//шаблон template/auth/login.hbs title: 'авторизация', error: req.flash('error')//вывод в шаблон ошибки, выводим по ключу erro }); }); /** * Авторизуем пользователя * первый параметр адрес страницы, в данном случае используется префикс при регистрации ройтера, * второй параметр callback - обработчик запроса req - request , запрос от браузера * res - response, ответ сервера */ router.post('/login', async (req, res) => { try{ const {email, password} = req.body;//данные post const candidate = await User.findOne({email: email});//получить пользователя if(candidate){//если пользователь существует const areSame = await bcrypt.compare(password, candidate.password);//сравниваем пароль if(areSame){//если пароль совпадает req.session.user = candidate;//получить пользователя, пока пользователь статичен req.session.isAuthenticated = true;//добавить в сессию свойство isAuthenticated = true req.session.save(err => {//метод необходим только в том случае когда, нужно подождать пока не сохранится сессия if(err){ throw err; } res.redirect('/');//редирект на главную страницу, // будет выполнен только после того как сессия сохранилась }); } else{ req.flash('error', 'Пароль не подходит');//сохроняем ошибку в сессию, с ключом error res.redirect('/auth/login#login'); } } else{ req.flash('error', 'Пользователь не существует');//сохроняем ошибку в сессию, с ключом error res.redirect('/auth/login#login'); } }catch(err){ console.log(err); } }); /** * Регистрация пользователя * первый параметр адрес страницы, в данном случае используется префикс при регистрации ройтера, * второй параметр callback - обработчик запроса req - request , запрос от браузера * res - response, ответ сервера */ router.post('/register', async (req, res) => { const {email, password, confirm, name} = req.body;//получить данные пользоватедя const candidate = await User.findOne({email: email});//поиск пользователя с таким же email if(password !== confirm){//Проверка пароля req.flash('error', 'Пароль не совпадает');//сохроняем ошибку в сессию, с ключом error res.redirect('/auth/login#register');//редирект на страницу регистрации } if(candidate){//если такой email уже зарегестрирован req.flash('error', 'Такой email уже существует');//сохроняем ошибку в сессию, с ключом error res.redirect('/auth/login#register');//редирект на страницу регистрации } else{ const hashPassword = await bcrypt.hash(password, 10);//Шифруем пароль const user = new User({email, name, password:hashPassword, cart: {items:[]}});//создание пользователя await user.save();//сохраняем запись res.redirect('/auth/login#login'); } } ); module.exports = router;//Экспортирум роутер