如何解决node接口超时问题?
2022-05-16 本文已影响0人
姜治宇
请求处理时间过长
有这样一个需求:
有一个g级的zip包,先上传到后台,后台经过解压后,处理里面的数据,然后再将处理好的数据再次压缩成zip,最后返回给前端下载。
这个过程可能耗时比较久,尤其是后台处理的过程,一个普通的http请求默认处理时间是2分钟,也就是说,如果超过了2分钟请求没有任何返回结果,那这个请求就会自动断开,从而导致程序报错,那怎么处理这种情况呢?
请求永不超时
我们可以针对这个特殊的长时间请求单独进行处理,让它永不超时,但其他的请求还是遵循2分钟法则,node有个res.setTimeout方法可以调用,我们来试试:
import { Controller, Get, Req, Res } from "@nestjs/common";
@Controller("file")
export class FileController {
constructor() { }
@Get('/zip')
handleZip(@Req() req, @Res() res) {
console.log('开始处理>>>');
res.setTimeout(0, () => {
console.log('处理中...');
setTimeout(() => {
res.send({
code: 200,
msg: '处理完成!'
});
console.log('处理完毕');
}, 5000*60);
});
}
}
我们的请求是5分钟完成,外面的res.setTimeout设置为0,表示永不超时。这样写行不行呢?我们可以试着运行一下。
很遗憾,这么写是错误的——因为这个请求永远不会执行到!
我看网上有些答案就是这么写的,还有的说用req.setTimeout,真是不负责任的误导。
正确的写法是res.connection.setTimeout(0)
import { Controller, Get, Req, Res } from "@nestjs/common";
@Controller("file")
export class FileController {
constructor() { }
@Get('/zip')
handleZip(@Req() req, @Res() res) {
console.log('开始处理>>>');
res.connection.setTimeout(0);
console.log('处理中...');
setTimeout(() => {
res.send({
code: 200,
msg: '处理完成!'
});
console.log('处理完毕');
}, 5000 * 60);
}
}