Инструменты пользователя

Инструменты сайта


nodejs:sessija_i_avtorizacijam:soobschenie_ob_oshibke

сообщение об ошибке (flash)

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;//Экспортирум роутер
nodejs/sessija_i_avtorizacijam/soobschenie_ob_oshibke.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)