Как обновить локальные e js без рендеринга дважды - PullRequest
0 голосов
/ 29 марта 2020

У меня есть форма, которая отправляет в "/ логин". На стороне app.post("/login",...) я отображаю представление «login.e js» с параметром loading: true, чтобы после проверки пароля отображалась анимация круга загрузки, и я перенаправляю пользователя в «/ dashboard». Но узел выдает эту ошибку:

Error: Can't set headers after they are sent.
        at validateHeader (_http_outgoing.js:491:11)
        at ServerResponse.setHeader (_http_outgoing.js:498:3)
        at ServerResponse.header (.../node_modules/express/lib/response.js:771:10)
        at ServerResponse.location (.../node_modules/express/lib/response.js:888:15)
        at ServerResponse.redirect (.../node_modules/express/lib/response.js:926:18)
        at bcrypt.compare.then (.../controllers/login.js:17:33)
        at <anonymous> 

Я предполагаю, что это как-то связано с express отправкой заголовков дважды. Как я могу реализовать эту функцию загрузки без этого?

Вот маршрут:

const express = require('express')
const router = express.Router()

const login_controller = require('../controllers/login')

router.get('/', login_controller.render_view)

router.post('/', login_controller.login_user)

module.exports = router;

А вот соответствующий контроллер:

const User = require('../models/user')
const bcrypt = require('bcryptjs')

exports.render_view = (req, res) => {
    res.render('login', {loading: false})
}

exports.login_user = async (req, res) => {
    res.render('login', {loading: true})
    const user = {
        email: req.body.email,
        password: req.body.password
    }
    const foundUser = await User.findOne({ email: user.email });
    if (foundUser) {
        bcrypt.compare(user.password, foundUser.password)
            .then((result) => {
                if (result) res.redirect('/dashboard')
                else console.log(false)
            })
            .catch((err) => {console.log('Exception thrown\n', err)});
    } else {
        console.log('User not found')
        res.redirect('/login')
    }
}

У меня есть видел ответы на других форумах, которые говорят, что это возможно только через AJAX, но я не знаю AJAX, поэтому, возможно, вы можете оставить пример того, как я бы go сделал это с AJAX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...