Node.js Express报错ERR_HTTP_HEADERS_SENT:setInterval致响应崩溃
问题:Express中使用setInterval延迟响应出现ERR_HTTP_HEADERS_SENT错误
为了测试前端功能,想延迟接口响应,于是在Express的POST路由里把res传入setInterval回调,代码如下:
router.post('/survey', userMiddleware.isLoggedIn, (req, res ,next) => { setInterval(() => { res.status(200).send({ message: 'Upload success!' }); }, 3000); });
运行后抛出以下错误:
node:_http_outgoing:576 throw new ERR_HTTP_HEADERS_SENT('set'); ^ Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at new NodeError (node:internal/errors:371:5) at ServerResponse.setHeader (node:_http_outgoing:576:11) at ServerResponse.header (/node/node-express-jwt-test/node_modules/express/lib/response.js:794:10) at ServerResponse.send (/node/node-express-jwt-test/node_modules/express/lib/response.js:174:12) at ServerResponse.json (/node/node-express-jwt-test/node_modules/express/lib/response.js:278:15) at ServerResponse.send (/node/node-express-jwt-test/node_modules/express/lib/response.js:162:21) at Timeout._onTimeout (/node/node-express-jwt-test/routes/router.js:83:22) at listOnTimeout (node:internal/timers:559:17) at processTimers (node:internal/timers:502:7) { code: 'ERR_HTTP_HEADERS_SENT' } Node.js v17.5.0 [nodemon] app crashed - waiting for file changes before starting...
原因分析
setInterval的特性是每隔指定时间重复执行回调,这里就是每3秒调用一次res.send()- HTTP协议的规则是一个请求对应一个响应,第一次调用
res.send()时,已经把响应头部和内容发送给了客户端,这个请求的响应流程已经结束 - 当
setInterval第二次执行回调,再次调用res.send()时,Express会尝试再次设置HTTP头部,但此时响应已经关闭,直接触发ERR_HTTP_HEADERS_SENT错误
解决方法
如果只是需要延迟一次响应,把setInterval换成setTimeout即可——它只会执行一次回调,符合HTTP请求-响应的规则:
router.post('/survey', userMiddleware.isLoggedIn, (req, res ,next) => { setTimeout(() => { res.status(200).send({ message: 'Upload success!' }); }, 3000); });
额外注意:
- 确保路由处理函数里没有其他地方提前发送响应(比如在定时器之外调用
res.send、next等) - 如果确实需要给客户端发送多次消息,普通HTTP接口做不到,得用WebSocket这类支持双向持久通信的协议
内容的提问来源于stack exchange,提问作者Max Pattern
相关产品推荐
相关产品推荐

