You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express使用res.redirect时报Cannot set headers after they are sent错误如何解决

问题原因
  • 该错误Error [ERR_HTTP_HEADERS_SENT]的本质是:单次HTTP请求的生命周期内,服务端重复向客户端发送响应头,而HTTP协议规定一次请求只能返回一次响应头。
  • 你的代码中具体触发场景为:用户token验证通过时,首先执行res.redirect('/dashboard'),该方法已经向客户端发送了重定向响应,结束了本次请求。但你随后又调用了next(),会继续执行后续的路由处理函数,里面的res.render('login')会再次尝试发送渲染页面的响应头,最终触发报错。
解决方法

只需要删除验证通过分支下的next()调用即可,重定向后不需要再执行后续的登录页渲染逻辑,修改后的中间件代码如下:

function checkGuest(req,res,next) {
  let token = req.cookies['session-token'];
  async function verify() {
    const ticket = await client.verifyIdToken({
      idToken: token,
      audience: CLIENT_ID
    })
  }
  verify()
  .then(() => {
    // 已登录用户直接重定向到dashboard,不继续执行后续逻辑
    res.redirect('/dashboard')
  })
  .catch(err => {
    // 未通过验证,继续执行登录页渲染逻辑
    next();
  }) 
}
拓展注意事项

在Express中只要调用了res.redirect()、res.render()、res.send()、res.json()等任意结束请求的方法后,都不要继续调用next()或者其他发送响应的方法,避免重复发送响应头的问题。

内容的提问来源于stack exchange,提问作者Saswat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:15:07