Express报ERR_HTTP_HEADERS_SENT错误原因及return修复原理咨询
首先明确该报错的核心本质:同一个HTTP请求的生命周期内,服务端不能重复向客户端发送响应(包括设置响应头、返回响应体等操作),重复操作就会触发ERR_HTTP_HEADERS_SENT报错。
问题1:初始代码触发报错的原因
你的初始中间件存在逻辑分支重叠的问题:
当请求携带的pwd参数等于chickennugget时,if判断成立,会先调用next()将控制权传递给后续匹配的路由处理函数。但next()本身不会终止当前中间件函数的执行,等后续路由处理逻辑执行完成(比如路由中调用的res.send("HOME PAGE!!")已经把完整响应返回给客户端),程序会回到当前中间件继续执行if判断外的res.send("Sorry, you need a password")代码,相当于对同一个请求第二次发送响应,因此触发报错。
问题2:添加return关键字修复问题的原理
return关键字的作用是终止当前函数的执行,你改为return next()后:
当if判断成立时,执行return next()会先调用next()将控制权交给后续中间件/路由,等后续逻辑执行完成后,不会再回到当前中间件执行后续代码,if判断外的res.send不会被触发,也就不会出现重复发送响应的情况,报错自然消失。
你也可以用分支隔离的方式实现相同效果,写法如下:
app.use((req, res, next) => { console.log(req.query); const { pwd } = req.query if (pwd === 'chickennugget') { next(); } else { res.send("Sorry, you need a password") } })
内容的提问来源于stack exchange,提问作者Ms.Jaffe
相关产品推荐
相关产品推荐

