web前端

如何解决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);

    }
}
上一篇下一篇

猜你喜欢

热点阅读