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

Node.js中出现Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client错误的求助

解决「Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client」错误

嘿,这个问题我太熟了!根源就在你的verify中间件里,咱们一步步拆解:

错误原因

这个报错本质是你给客户端发送了两次HTTP响应。看你的中间件代码,在try/catch块的外面写了next()——不管try里有没有触发return(比如没有auth、JWT验证失败的场景),这个外层的next()都会执行,导致后续的路由处理函数又尝试发送一次响应,自然就触发了「不能在发送响应后再设置headers」的错误。

举个具体场景:

当请求没有auth cookie时,你通过return res.status(403).json({ msg: "Not Authorized" })已经给客户端发了响应,但代码会继续走到外层的next(),让router.get("/")的处理函数执行,它又会尝试发送一次200或403的响应,这就冲突了!

修复后的verify中间件代码

把next()移到try块的else分支里,只有当JWT验证完全通过时才调用next(),让后续路由继续处理:

// 修复后的verify中间件
try { 
  const { auth } = req.cookies; 
  if (!auth) { 
    return res.status(403).json({ msg: "Not Authorized" }); 
  } else { 
    const data = jwt.verify(auth, process.env.JWT_SECRET); 
    req.user = data.id; 
    next(); // 只有验证通过才调用next(),让路由继续执行
  } 
} catch (error) { 
  return res.status(403).json({ msg: "Not Authorized" }); 
} 
// 删掉外层的next()!

验证修复逻辑

  • 当没有auth cookie,或者JWT验证失败进入catch时,代码会通过return直接发送响应,不会执行next(),也就不会触发后续路由的重复响应
  • 只有当JWT验证成功,设置了req.user后,才会调用next(),让路由处理函数执行,此时只会发送一次响应,完美解决报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:42:39