Node.js中POST请求调用res.redirect重定向不生效问题
问题原因
fetch发起的是异步AJAX请求,这类请求触发的重定向只会被浏览器在异步请求链路内部自动跟随处理,完全不会触发当前页面的顶层导航跳转。
你日志里记录的GET / 304请求,就是fetch自动跟随302响应发的,这个请求的返回结果只会交付给调用fetch的JS逻辑,不会驱动浏览器加载新页面,所以不管后端返回302还是303状态码,都不会出现页面跳转。
修复方案
二选一即可:
方案1:前端请求完成后主动跳转
修改前端登出逻辑,等登出接口请求成功后,主动通过JS触发页面跳转,后端不需要再返回重定向响应,返回200状态码标识登出成功即可:function logout() { fetch('/logout', { method: 'POST' }) .then(() => { window.location.replace('/'); // 也可以用 window.location.href = '/',replace不会在历史记录留登出页记录,体验更好 }); }对应后端代码可以删掉
res.redirect('/'),改成res.sendStatus(200)即可,保留重定向逻辑也不会影响功能。方案2:改用表单提交触发页面级请求
不用fetch发异步请求,直接用原生表单提交POST请求,这类请求属于页面导航级请求,后端返回的重定向会被浏览器正常处理,直接跳转到目标页:<form action="/logout" method="POST"> <button type="submit">退出登录</button> </form>这种写法不需要额外写JS事件逻辑,你原来写的后端重定向代码可以直接生效。
内容的提问来源于stack exchange,提问作者Nandor Krizbai
相关产品推荐
相关产品推荐

