首页 > 解决方案 > res.download() 下载大文件时抛出“请求中止”错误

问题描述

我的 MEAN 堆栈应用程序需要一个功能,用户可以从 s3 上可用的文件列表中选择任意数量的文件,然后将其下载、压缩并作为下载返回给用户。对于非常大的文件,在下载/压缩较大的文件时初始请求会超时,因此现在有 3 个单独的请求。第一个请求是一个提供文件列表的 POST,它返回一个令牌。一旦此请求返回,将使用此令牌发送第二个持续轮询 GET 请求以确定下载/压缩是否完成。这将每秒触发一次,直到收到所需的响应。文件下载和压缩完成后,会生成一个与提供的令牌匹配的数据库条目,它满足第二个请求,现在第三个也是最后一个请求 GET 触发,

function downloadZip( req: Request, res: Response, next: Function ) {

if ( !req.params.token ) {
    return next( new Error( "downloadZip requires token." ) );
}

icmDownloadModel.findByToken( req.params.token, ( err, data ) => {

    if ( err ) {
        return next( err );
    }

    if ( data && data.fileName && data.token ) {

        let localPath: string = path.join( __dirname, "..", "uploads", data.token + '.zip' );

        res.download( localPath, data.fileName, err => {

            if ( err ) {
                return next( err );
            }

            fs.unlink( localPath );

            icmDownloadModel.delete( data._id, ( err ) => {
                if ( err ) {
                    next( err );
                }
            });

        } );

    } else {

        next( new Error( "Unable to locate file." ) );
    }

} );

};

到目前为止,这几乎可以完美运行,但是,当尝试下载 1GB+ 的文件时,我收到一条错误消息,提示“请求中止”。这些文件已从 s3 成功下载并压缩,但 res.download() 几秒钟后就崩溃了。我已经成功地下载了超过 250MB 的文件。此外,这在我的本地实例上运行良好,但在实时 DEV 环境中失败。

任何帮助,将不胜感激。

标签: node.jsamazon-web-servicesexpressnginxamazon-s3

解决方案


推荐阅读