使用Express框架在setInterval内响应请求出现ERR_HTTP_HEADERS_SENT错误
ERR_HTTP_HEADERS_SENT 错误原因及修复
错误原因
你遇到的ERR_HTTP_HEADERS_SENT错误,本质是同一个HTTP请求中被多次尝试发送响应。
你的代码里使用了setInterval,这个API的作用是每隔指定时间重复执行回调函数。第一次等待5秒后,res.send("hello")会正常把响应发送给客户端,此时该请求的响应流程已经完成——响应头和响应体都已经发送给客户端,连接的状态也已结束。但5秒后setInterval会再次触发回调,这时再调用res.send,Node.js会尝试再次为这个已经完成的请求设置响应头、发送响应,这显然不符合HTTP协议的规则,因此抛出错误。
另外,setInterval如果不手动清除,会持续在后台执行,即便请求已经处理完毕,这还会造成不必要的内存消耗。
修复方案
你需要的是延迟5秒后发送一次响应,而非重复发送,所以应该把setInterval替换为setTimeout(仅执行一次回调):
app.get("/",(req,res)=>{ setTimeout(function(){ res.status(200); res.send("hello"); },5000) })
setTimeout只会在5秒后执行一次回调,发送完响应后就完成了该请求的处理,不会再触发后续的响应操作,自然也就不会出现重复发送响应的错误。
内容的提问来源于stack exchange,提问作者prudhvi
相关产品推荐
相关产品推荐

