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

Express中间件报错:Cannot set headers after they are sent to the client

解决Express中间件中的Error [ERR_HTTP_HEADERS_SENT]问题

咱们先拆解这个错误:ERR_HTTP_HEADERS_SENT本质是同一个HTTP请求被你发送了两次响应,而HTTP协议明确要求一个请求只能对应一个响应,所以Express会抛出这个错误。

你的代码里的问题根源

看你的authenticateUser中间件:

  • 当请求头里没有x-auth令牌时,你执行了res.json({ errMessage: 'Invalid token' }),但这里没有加return语句!这会导致代码继续向下执行,进入后面的try块
  • 此时token是undefined,调用verify(token, privateKey)必然会抛出错误,进入catch块,你又执行了一次res.status(401).json(...)——这就造成了两次给客户端发响应,直接触发了这个错误

修复方案

只需要在每个发送响应的分支后加上return,确保函数执行到这里就终止,不会继续跑后续代码。修改后的完整代码如下:

const authenticateUser = (req, res, next) => { 
  const token = req.header('x-auth'); 
  if (!token) { 
    // 发送响应后立即return,阻断后续代码执行
    return res.json({ errMessage: 'Invalid token' }); 
  } 
  try { 
    const tokenData = verify(token, privateKey); 
    req.user = { name: tokenData.name, email: tokenData.email, _id: tokenData._id } 
    next(); 
  } catch (error) { 
    // 链式调用+return,既简洁又确保终止执行
    return res.status(401).json({ errMessage: 'Invalid token', error }); 
  } 
}

另外提个小优化:在catch块里可以把res.status(401);和res.json()改成链式调用,代码更紧凑,可读性也更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:27:28