@mrrangerr

Почему не происходит авторизация пользователя?

Всем привет, пытаюсь сделать авторизацию с помощью сессии. Перехожу на нужный роут, валидация отрабатывает правильно, но если ввожу правильные данные сначало идет долгая загрузка. и вылетает ошибка "Страница недоступна Сайт localhost не отправил данных." В чем проблема?

const express = require('express')
const bodyParser = require('body-parser')
const session = require('express-session')
const MySQLStore = require('express-mysql-session')(session)
const Sequelize = require('sequelize')
const db = require('./models')
const bcrypt = require('bcryptjs')
const hbs = require('hbs')
const expressHbs = require("express-handlebars");

const app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
    extended: true
}))
app.engine('hbs', expressHbs({
    layoutsDir: 'views/layouts',
    defaultLayout: 'layout',
    extname: 'hbs'
}))
hbs.registerPartials(__dirname + '/views/partials')
app.use("/public", express.static("public"))


const User = db.user
const SequelizeStore = require('connect-session-sequelize')(session.Store)
const sequelize = new Sequelize('stroymag', 'root', 'password', {
    dialect: 'mysql',
})
const myStore = new SequelizeStore({
    db: sequelize
})

const TWO_HOURS = 1000 * 60 * 60 * 2
const {
    PORT = 3000,
    NODE_ENV = 'development',
    SESS_NAME = 'sid',
    SESS_LIFETIME = TWO_HOURS,
    SESS_SECRET = 'ssh!quiet,it\'asecret!'
} = process.env

const IN_PROD = NODE_ENV === 'production'

app.use(session({
    name: SESS_NAME,
    resave: false,
    saveUninitialized: false,
    secret: SESS_SECRET,
    store: myStore,
    cookie: {
        maxAge: SESS_LIFETIME,
        sameSite: true,
        secure: IN_PROD
    }
}))

myStore.sync()

app.get('/', (req, res) => {
    res.render('index.hbs')
})

app.get('/profile', (req, res) => {
    if (req.session.userId) {
        User.findOne({
            raw: true,
            where: {
                id: req.session.userId
            }
        })
            .then(user => {
                if (!user) {
                    console.log("Что то пошло не так")
                }
                res.render('profile.hbs', {
                    name: user.username,
                    email: user.email
                })

            })
    } else {
        res.send("Нет сессии")
    }
})

app.get('/login', (req, res) => {
    if (req.session.userId) {
        res.redirect('/profile')
    } else {
        res.render('login.hbs')
    }
})

app.post('/login', (req, res) => {
    User.findOne({
        where: {
            email: req.body.email
        }
    })
        .then(user => {
            if (!user) {
                return res.status(404).send({ message: "Введены неправильные данные!" });
            }
            const passwordIsValid = bcrypt.compareSync(req.body.password, user.password)
            if (!passwordIsValid) {
                return res.status(401).send({
                    message: "Введены неправильные данные!"
                });
            }
            req.session.userId = user.id
        })
})

app.listen(PORT, () => console.log(`http://localhost:${PORT}`))
  • Вопрос задан
  • 399 просмотров
Решения вопроса 1
hzzzzl
@hzzzzl
если ввожу правильные данные сначало идет долгая загрузка. и вылетает ошибка "Страница недоступна Сайт localhost не отправил данных.

так он ведь ничего и не отправляет, тут надо бы что-то отрендерить или редиректить, или послать какой нибудь ответ в браузер

app.post('/login', (req, res) => {
    User.findOne({
        where: {
            email: req.body.email
        }
    })
        .then(user => {
            if (!user) {
                return res.status(404).send({ message: "Введены неправильные данные!" });
            }
            const passwordIsValid = bcrypt.compareSync(req.body.password, user.password)
            if (!passwordIsValid) {
                return res.status(401).send({
                    message: "Введены неправильные данные!"
                });
            }

            req.session.userId = user.id   // ОК
            // и что дальше?

        })
})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 22:26
3500 руб./за проект
22 нояб. 2024, в 21:47
3000 руб./за проект
22 нояб. 2024, в 21:44
50000 руб./за проект