Express使用res.redirect时报Cannot set headers after they are sent错误如何解决
问题原因
- 该错误
Error [ERR_HTTP_HEADERS_SENT]的本质是:单次HTTP请求的生命周期内,服务端重复向客户端发送响应头,而HTTP协议规定一次请求只能返回一次响应头。 - 你的代码中具体触发场景为:用户token验证通过时,首先执行
res.redirect('/dashboard'),该方法已经向客户端发送了重定向响应,结束了本次请求。但你随后又调用了next(),会继续执行后续的路由处理函数,里面的res.render('login')会再次尝试发送渲染页面的响应头,最终触发报错。
解决方法
只需要删除验证通过分支下的next()调用即可,重定向后不需要再执行后续的登录页渲染逻辑,修改后的中间件代码如下:
function checkGuest(req,res,next) { let token = req.cookies['session-token']; async function verify() { const ticket = await client.verifyIdToken({ idToken: token, audience: CLIENT_ID }) } verify() .then(() => { // 已登录用户直接重定向到dashboard,不继续执行后续逻辑 res.redirect('/dashboard') }) .catch(err => { // 未通过验证,继续执行登录页渲染逻辑 next(); }) }
拓展注意事项
在Express中只要调用了res.redirect()、res.render()、res.send()、res.json()等任意结束请求的方法后,都不要继续调用next()或者其他发送响应的方法,避免重复发送响应头的问题。
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

