Node.js请求超时设置未生效?Koa服务与Axios客户端问题排查
问题
我有一个基于Koa的服务器,其中包含一个处理时长约3分钟的POST路由。我通过以下代码设置服务器超时:
let app = new Koa(); let server=app.listen(3000); server.timeout=5*60*1000; // 设置为5分钟
客户端也设置了超时,通过以下代码发送POST请求:
const request = await axios.post('https://somewebsite.herokuapp.com/testkeepalive', {}, {timeout:240000}) console.log('request is ', request)
发送请求后服务器仍返回超时错误,无法按预期执行。
/testkeepalive接口代码
.post('/testkeepalive', async ctx => { console.log('request received') ctx.request.socket.setTimeout(5 * 60 * 1000) ctx.request.socket.setKeepAlive(true) await delay(3 * 60 * 1000) // 延迟3分钟后返回响应 ctx.body = "nice" ctx.status = 202 })
客户端错误截图

原因与解决方案
你的代码本身没有问题,超时错误的根源在于Heroku平台的默认请求超时限制为30秒——不管你在Koa服务器或客户端设置多长的超时时间,Heroku都会在请求发起30秒后强制切断连接,返回超时错误。
解决办法有两种:
- 迁移至无此限制的平台:将服务器部署到AWS EC2等支持长请求的平台,并配置好HTTPS SSL证书,即可正常处理3分钟的请求。
- 继续使用Heroku:需要将长耗时的任务改为后台异步任务,通过队列系统处理,避免让HTTP请求等待任务完成。具体可参考Heroku官方关于后台任务队列的文档指导。
内容的提问来源于stack exchange,提问作者Iulian
相关产品推荐
相关产品推荐

