Tengo un sistema de inicio de sesión, el usuario publica datos en / ruta de inicio de sesión y guarda datos si se registra correctamente.
router.post('/login', function(req, res, next) { if(req.method == 'POST') { const username = req.body.username; const password = req.body.password; sql.query('SELECT * FROM `users` WHERE `username` = "'+username+'"', function(err, results) { if(err) { req.session.message = {status: 'danger', message: 'Failed to login, check password.'} res.redirect('/') } else if (results.length != 0) { const passw = results[0].password; bcrypt.compare(password, passw, function(err, result) { if(result) { req.session.loggedin = true; req.session.data = results[0]; req.session.message = {status: 'success', message: `Welcome back, ${username}.`} req.session.save(function(err) { res.redirect(req.headers.referer); }) } else { req.session.message = {status: 'danger', message: 'Failed to login, check password.'} res.redirect('/') } }); } else { req.session.message = {status: 'danger', message: 'Failed to login, check username.'} res.redirect('/') } }) } });por lo tanto, guarda los datos y los redirige al índice, pero cada vez que un usuario ingresa a la página de índice, muestra el mensaje de bienvenida, obviamente lo hace porque la variable aún está definida, por lo que mi objetivo es cambiar esa variable demasiado nula después de iniciar sesión y la bienvenida. el mensaje aparece una vez.
He intentado:
delete req.session.messagepero esto solo elimina la variable antes de que pase a la siguiente solicitud.
Cómo estoy mostrando el mensaje:
<script type="text/javascript"> var message = JSON.parse('<%- JSON.stringify(message) %>'); $(document).ready(function(){ if(message != null) { $('.toast').addClass('bg-' + message.status); $('.toast-body').html(message.message) $(".toast").toast('show'); } }); </script>Cómo estoy renderizando los datos:
if(req.session.loggedin) { res.render('index', { loggedin: true, data: req.session.data, message: req.session.message }); } else { res.render('index', { loggedin: false, data: null, message: req.session.message }); }Después de representar su página que contiene el mensaje, debe borrar el mensaje de la sesión:
if (req.session.loggedin) { res.render('index', { loggedin: true, data: req.session.data, message: req.session.message }); } else { res.render('index', { loggedin: false, data: null, message: req.session.message }); } req.session.message = null; req.session.save(); Y, para evitar cualquier posibilidad de una condición de carrera entre una redirección y el guardado de la sesión, no debe redirigir hasta que haya guardado manualmente la sesión. El problema es que confiar en el autoguardado de la sesión mediante express-session intentará guardar la sesión DESPUÉS de enviar el res.redirect() , pero enviar el res.redirect() le dice al navegador que solicite inmediatamente otra página para que configura una carrera entre el guardado automático de la sesión y la nueva solicitud entrante de res.redirect() . No quieres esa carrera. Desea asegurarse de que la sesión se haya guardado antes de emitir la redirección. Entonces, puse res.redirect() dentro de una devolución de llamada req.session.save() para evitar cualquier posible condición de carrera:
router.post('/login', function(req, res, next) { if(req.method == 'POST') { const username = req.body.username; const password = req.body.password; sql.query('SELECT * FROM `users` WHERE `username` = "'+username+'"', function(err, results) { if(err) { req.session.message = {status: 'danger', message: 'Failed to login, check password.'} res.redirect('/') } else if (results.length != 0) { const passw = results[0].password; bcrypt.compare(password, passw, function(err, result) { if(result) { req.session.loggedin = true; req.session.data = results[0]; req.session.message = {status: 'success', message: `Welcome back, ${username}.`} req.session.save(function(err) { res.redirect(req.headers.referer); }) } else { req.session.message = {status: 'danger', message: 'Failed to login, check password.'} req.session.save(() => { res.redirect('/') }); } }); } else { req.session.message = {status: 'danger', message: 'Failed to login, check username.'} req.session.save(() => { res.redirect('/') }); } }) } });