node.js - 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 环境中失败。
任何帮助,将不胜感激。
解决方案
推荐阅读
- android - 低功耗 Android 设备的最大性能?Unity 渲染基准
- python - 混合使用列的聚合 - 熊猫
- python - 我无法创建有效的 kivy 文件
- makefile - 将外部构建系统与 (GNU) make 集成
- iis - 在默认网站下创建的 IIS 网站未加载
- hash - “certutil”中的 SHA-512 是否不区分大小写?
- ruby - 用于 Kconfig 的 Lex/Rex 和 Yacc/Racc 文件
- android - 如何在 Android 中同时在多个显示器上显示视频帧?
- postgresql - 登录通过 docker-compose 创建的 Postgres 数据库时身份验证失败
- flutter - 在构造函数颤动中从 API 更新值