Estoy tratando de crear una página de inicio de sesión que redirige al usuario a la página de inicio después de iniciar sesión correctamente usando nodejs y fetch. Aquí está el código de backend.
app.post('/login',(req,res)=> { user.findOne(req.body,(err,info)=>{ if(err) { res.json(`error in finding item in database ,error info ${err}`); } else if(!info) { console.log('user doesnot exist'); let message='*please enter a valid username and password'; res.json(message); } else{ console.log(info); res.redirect('/'); } }); });Este es el código de la parte delantera
form.addEventListener('submit',(e)=>{ e.preventDefault(); const username=document.getElementById('username').value.trim(); const password=document.getElementById('password').value; fetch('/login',{ method:'POST', headers:{ 'Content-Type':'application/json' }, redirect:"manual", body:JSON.stringify({username,password}) }).then((res)=>{ if(res.redirected) { console.log(`redirected to ${res.url}`); window.location.href=res.url; // return; } else{ console.log("no") return res.json() } }) .then((data)=>{ if(data) alt.innerText=data;//showing the error on the page }) .catch((err)=>{throw err}) })Cuando ingreso las credenciales correctas, imprime la información en la consola, lo que significa que está dentro de else e idealmente debería redirigir a la página de inicio. Pero nunca ingresa a la declaración if (res.redirected) , lo que significa que devuelve falso.
Dado que algunas versiones anteriores de Chrome no leen res.redirected , y en aras de lograr códigos más limpios y redireccionamientos inesperados (por ejemplo, HTTP a HTTPS), es posible que desee establecer res.direct('/') en res.json({ redirect: '/' }) en su lugar.
const results = await fetch(....).then(res.json()); if (results.redirect) { window.location.href = results.redirect } if (results.data) { //do something }back-end
if (info) { return res.json({ data: info }); } else { return res.json({ redirect: '/', error: true }) }