【问题标题】:res.redirected returning false even when the backend returns a redirect即使后端返回重定向,res.redirected 也会返回 false
【发布时间】:2022-02-09 13:15:29
【问题描述】:

我正在尝试创建一个登录页面,该页面在使用 nodejs 成功登录并获取后将用户重定向回主页。 这是后端的代码。

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('/');
        }
    });

}); 

这是前端代码

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})
})

当我输入正确的凭据时,它会在控制台上打印信息,这意味着它在 else 内,理想情况下应该重定向回主页。但它永远不会进入 if(res.redirected) 语句,这意味着它返回 false。

【问题讨论】:

  • 您是否尝试过console.log(res.redirected) 值以及它返回的值..?
  • @SomeoneSpecial 是的,它返回 false
  • 那么它永远不会被调用。查看我的解决方案以获得更好的方法。通常最好不要以您的方式使用重定向,因为您可能会遇到意想不到的结果。例如,如果您调用 http://example.com 并且它重定向到 https://example.com 您也会被重定向。

标签: javascript node.js express mongoose fetch-api


【解决方案1】:

由于某些较旧的 chrome 版本不读取 res.redirected,并且为了实现更清晰的代码以及意外重定向(例如 HTTP 到 HTTPS),您可能希望将 res.direct('/') 设置为 res.json({ redirect: '/' })

const results = await fetch(....).then(res.json());

if (results.redirect) {
     window.location.href = results.redirect
}

if (results.data) {
     //do something
}

后台

if (info) {
   return res.json({ data: info });
} else {
   return res.json({ redirect: '/', error: true })
}

【讨论】:

  • 您能否详细说明error:true 的作用?
  • 只是演示如何让前端知道有错误。如果你愿意,你可以忽略它。否则,您可以检查result.error,如果是,则显示错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2012-01-14
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2017-10-20
  • 2016-05-28
相关资源
最近更新 更多