Express实现登录后按布尔值跳转时报ERR_HTTP_HEADERS_SENT错误如何解决
错误原因
Error [ERR_HTTP_HEADERS_SENT] 报错的核心原因有两个:
- 同一个请求的处理逻辑中连续调用了两次
res.redirect,第一次重定向到登录页的操作已经向客户端发送了响应头,后续再次调用修改响应头的方法就会触发该错误 - 业务逻辑时序错误:你将登录完成后的判断逻辑直接写在了重定向到登录的代码之后,这段代码会在触发登录重定向时同步执行,不会等待用户实际完成登录操作
可行解决方案
你需要拆分登录前拦截、登录后判断的逻辑,同时每次调用响应方法后加return阻断后续代码执行,避免重复发送响应。
1. 全局路由拦截(仅做未登录判断)
app.get('*', (req, res, next) => { // 此处替换为你自己的登录态校验逻辑,比如判断session、cookie中的登录标识 const isLogined = req.session?.userInfo ? true : false // 未登录且访问的不是登录页,重定向到登录页 if (!isLogined && req.path !== '/login') { // 加return阻断后续代码执行,避免继续向下执行 return res.redirect(302, '/login') } next() })
2. 登录接口逻辑(登录完成后根据布尔变量判断跳转目标)
app.post('/login', (req, res) => { // 此处为账号密码校验逻辑,校验通过后执行跳转判断 const flag = 你的布尔变量 // 按业务需求赋值 if (flag) { return res.redirect(302, '/error') } // 不满足flag条件时,跳转到首页或用户原本要访问的地址 return res.redirect(302, '/home') })
如果需要实现用户登录后跳转回原本要访问的页面,可在重定向到登录页时携带来源地址参数,登录完成后读取该参数跳转即可。
内容的提问来源于stack exchange,提问作者Andres
相关产品推荐
相关产品推荐

