Node.js Express报错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错误核心是异步执行顺序导致的重复响应:
- 你使用的
jwt.verify回调为异步执行逻辑,会先让出执行线程,路由处理函数本身会先运行结束,Express判定当前路由未处理响应,会继续执行后续的中间件(如404处理中间件、全局错误中间件),如果后续中间件已经发送了响应,等jwt.verify回调触发时你再次调用res.send就会触发该错误。 - 额外添加的
async关键字放大了该问题:你为路由处理函数标记了async但内部没有使用await,Express会等待async函数返回的Promise状态变更后再判断是否流转到后续中间件,但你的异步逻辑都封装在回调内,Promise会提前变为resolved状态,仍会触发后续中间件的执行。
解决方案
方案1:改用async/await写法(推荐)
将回调式的jwt.verify转为Promise调用,搭配await让Express等待验证逻辑完成后再做后续处理:
const { promisify } = require('util') const verifyJwt = promisify(jwt.verify) router.post("/:id/:token", async (req, res) => { try { const decoded = await verifyJwt(req.params.token, config.secret) res.status(200).send(decoded) } catch (err) { res.status(400).send(err) } })
方案2:移除多余async关键字
如果不想改动原有回调写法,直接删除路由处理函数前的async关键字即可,无需额外修改其他逻辑:
router.post("/:id/:token", (req, res) => { jwt.verify(req.params.token, config.secret , function(err, decoded) { if(err) { res.status(400).send(err); return; } else { res.status(200).send(decoded); return; } }) })
内容的提问来源于stack exchange,提问作者Keltouma Indtaher
相关产品推荐
相关产品推荐

