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」的错误。
举个具体场景:
当请求没有
authcookie时,你通过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()!
验证修复逻辑
- 当没有
authcookie,或者JWT验证失败进入catch时,代码会通过return直接发送响应,不会执行next(),也就不会触发后续路由的重复响应 - 只有当JWT验证成功,设置了
req.user后,才会调用next(),让路由处理函数执行,此时只会发送一次响应,完美解决报错
内容的提问来源于stack exchange,提问作者Ahnaf Hasan
相关产品推荐
相关产品推荐

