У меня есть форма, которая отправляет в "/ логин". На стороне 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.