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
相关产品推荐
相关产品推荐

