如何让客户端下载动态生成的非常大的文件

2024-04-17

我有一个导出功能,可以读取整个数据库并创建一个包含所有记录的 .xls 文件。然后文件被发送到客户端。

当然,导出完整数据库的时间需要大量时间,并且请求很快就会以超时错误结束。

处理这种情况的最佳解决方案是什么?

例如,我听说过使用 Redis 创建队列,但这需要两个请求:一个用于启动将生成文件的作业,第二个用于下载生成的文件。

这可以通过客户的单个请求实现吗?


Excel 导出:

Use Streams https://nodejs.org/dist/latest-v7.x/docs/api/stream.html#stream_stream。以下是可能采取的措施的粗略想法:

  1. Use Exceljs模块 https://www.npmjs.com/package/exceljs。因为它有一个流媒体API https://www.npmjs.com/package/exceljs#streaming-io针对这个问题。

    var Excel = require('exceljs')
    
  2. 因为我们正在尝试启动下载。写入适当的标头以进行响应。

    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls');
    res.setHeader('Content-type', 'application/vnd.ms-excel');
    
  3. 创建一个由以下内容支持的工作簿流式 Excel 编写器 https://www.npmjs.com/package/exceljs#streaming-xlsx-writer。提供给 writer 的流是服务器响应。

    var options = {
        stream: res, // write to server response
        useStyles: false,
        useSharedStrings: false
    };
    
    var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
    
  4. 现在,输出流已全部设置完毕。对于输入流,更喜欢将查询结果/光标作为流提供的数据库驱动程序。

  5. 定义一个异步函数,将 1 个表转储到 1 个工作表。

    var tableToSheet = function (name, done) {
        var str = dbDriver.query('SELECT * FROM ' + name).stream();
        var sheet = workbook.addWorksheet(name);
    
        str.on('data', function (d) {
            sheet.addRow(d).commit(); // format object if required
        });
    
        str.on('end', function () {
            sheet.commit();
            done();
        });
    
        str.on('error', function (err) {
            done(err);
        });
    }
    
  6. 现在,让我们导出一些数据库表,使用async https://www.npmjs.com/package/async模块的地图系列 http://caolan.github.io/async/docs.html#mapSeries:

    async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){
       if(err){
         // log error
       }
       res.end();
    })
    

导出 CSV:

用于单个表/集合模块的 CSV 导出fast-csv https://www.npmjs.com/package/fast-csv可以使用:

// response headers as usual
res.status(200);
res.setHeader('Content-disposition', 'attachment; filename=mytable_dump.csv');
res.setHeader('Content-type', 'text/csv');

// create csv stream
var csv = require('fast-csv');
var csvStr = csv.createWriteStream({headers: true});

// open database stream
var dbStr = dbDriver.query('SELECT * from mytable').stream();

// connect the streams
dbStr.pipe(csvStr).pipe(res);

您现在正在将数据从 DB 流式传输到 HTTP 响应,并将其即时转换为 xls/csv 格式。无需将整个数据缓冲或存储在内存或文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让客户端下载动态生成的非常大的文件 的相关文章

  • Mongoose 查询:删除“_id”属性,在结果中保留虚拟属性“id”

    我正在运行 Express js 应用程序 并且有以下设置 模型 js var schemaOptions toJSON virtuals true toObject virtuals true var modelSchema new mo
  • 让 webpack 热更新在我的同构 Web 应用程序中正常工作

    我正在创建一个带有 Node Express 后端和 React 前端的 Web 应用程序 我 我认为 大部分内容都已启动并运行 但让浏览器执行热刷新的最后一步并未按预期工作 我会尝试在这里发布所有相关设置 如果您需要其他任何信息来找出我哪
  • 使用 knex.js 查询多个表

    我想渲染Expres js and knex js两个表仅使用一个 get 函数 以便在一个 HTML 模板中使用两个表中的数据 当我只查询一张表 学校或学生 但我不知道如何处理两张表时 它会起作用 有什么建议吗 app get schoo
  • Nodejs:带有 URL 列表的异步请求

    我正在研究爬虫 我有一个需要请求的 URL 列表 如果我不将其设置为异步 则会同时有数百个请求 我担心它会爆炸我的带宽或产生对目标网站的大量网络访问 我应该怎么办 这是我正在做的事情 urlList forEach url index gt
  • MongoDB $geoIntersects 不适用于包含负顶点的多边形

    我已在数据库中存储了跨越 x 轴和 y 轴的多边形 并且我想搜索包含给定点的多边形 为此 我使用 geoIntersects 运算符来指定一个点 但是 当多边形穿过轴时 MongoDB 不会返回任何多边形 我可以对查询或架构进行任何小的更改
  • var io = require('../..')(server) 做什么?

    我已经构建了该项目https github com Automattic socket io tree master examples chat https github com Automattic socket io tree mast
  • 无法读取未定义的属性“isLoggedIn”

    此代码用于添加产品 然后添加到购物车和订单 并在后端使用 mongodb 创建 pdf 实际上 session isLoggedIn 是在 auth js 中定义的 检查该代码 但仍在 app js 中它给出了此错误 应用程序 JS代码 c
  • 尝试安装 gulp 时 npm 挂起

    UPDATED 当我尝试使用 npm install 或任何变体安装任何软件包时 npm install gulp g verbose npm install gulp verbose npm install gulp npm instal
  • 在spawn中使用两个命令(使用管道|)

    我正在内存中将文档转换为 pdf unoconv 并在终端中打印 pdftotext unoconv f pdf stdout sample doc pdftotext layout enc UTF 8 out txt 工作中 现在我想使用
  • JavaScript TypeError:无法读取未定义的属性“startsWith” - 不和谐机器人

    在开始这个问题时 我必须说我对 javascript 知之甚少 我在 Java 中练习过 只是想制作一个 有点 简单的 Discord 机器人 它会随机说出消息 我将各种教程中的 2 段代码组合在一起 目前有 var Discord req
  • 如何模拟 typeorm 连接

    在集成测试中 我使用以下代码片段来创建连接 import Connection createConnection from typeorm ts ignore import options from ormconfig js export
  • Node + Express 与静态 HTML。如何将所有请求路由到index.html?

    我正在开发一个单页 Web 应用程序 使用 Node Express 和 Handlebars 进行模板化 目前 index html 的一切都运行良好 它由一个非常标准的 server js 文件提供 var express requir
  • 如何高效地将数十亿数据插入Redis?

    我有大约 20 亿个键值对 我想将它们有效地加载到 Redis 中 我目前正在使用 Python 并使用 Pipe 如redis py https redis py readthedocs io en latest redis Redis
  • Firebase 函数,admin.database().ref(...).get() 不是函数

    我正在开发一个 Android 应用程序 并使用 firebase 作为它的后端 我正在尝试让通知系统正常工作 该系统依赖于监听数据库中的更改 但遇到问题 因为我收到以下错误 想知道是否有人能够提供帮助 可以提供任何额外的代码 Fireba
  • Express/node.js 204 HTTP 代码响应问题

    这是我的代码 put function req res User findById req params user id function err user if err return res send err user dateEdite
  • 节点检查器显示对象“无属性”

    我在调试场景中相当陌生 尤其是节点检查器 安装节点检查器后 我使用 debug 参数启动了简单的节点应用程序 并且能够在 localhost 8080 debug port 5858 处看到调试视图 当我让应用程序在此断点处停止时 rout
  • 如何从控制器返回 PDF 文件

    我正在尝试使用 NestJs 从控制器端点返回 PDF 文件 未设置时Content typeheader 返回的数据getDocumentFile 很好地返回给用户 然而 当我添加标头时 我得到的返回似乎是某种奇怪形式的 GUID 响应总
  • 如何模拟“焦点”和“打字”事件

    尝试模拟 onfocus 和打字事件 但它不起作用 Sub Login MyLogin MyPass Dim IEapp As InternetExplorer Dim IeDoc As Object Dim ieTable As Obje
  • 将 html2pdf 生成的 pdf 发送回服务器

    我必须使用以下命令发送客户端生成的 PDFhtml2pdf到服务器 我已成功将生成的 PDF 转换为 base64 并希望使用axios 这是我的客户端代码 function myFunction var element document
  • NodeJs 控制台中的 GET /bla - - ms - - 是什么意思?

    当我进入页面时 bla在我的 NodeJS 应用程序中 控制台打印出 GET bla ms 用文字来说 为了更容易谷歌搜索 dash dash ms dash dash 这是什么意思 这是输出morgan https github com

随机推荐

  • Html.ActionLink 无法动态调度

    我的 MVC3 有问题 我正在尝试使用 Html ActionLink 为我的博客项目中的标题生成链接 在中使用常量字符串ActionLink效果很好 但如果我使用Posts Title 当前帖子模型的标题被循环 我得到这个异常 CS197
  • 如何减少flutter web应用程序的加载时间

    截至目前 我们可以将 flutter web 应用程序作为单个文件启动 该文件将立即加载 因此需要花费大量时间和带宽来加载 这并不理想 有没有办法一次只加载一个页面 而不是整个网络应用程序 我的意思是 一次加载一个小部件 任何建议将不胜感激
  • 卡夫卡高级消费者 error_code=15

    当尝试使用高级消费者 使用全新的消费者组 从 Kafka 进行消费时 消费者永远不会开始运行 当我将日志记录级别切换为调试时 我可以看到以下两行一遍又一遍地重复 DEBUG AbstractCoordinator 09 43 51 192
  • 了解跟踪*

    再会 当试图理解数学使用标准的评估顺序Trace and TraceScan最近开发的命令及其漂亮的视觉表示thread https stackoverflow com questions 5459735 the clearest way
  • foreach(... in ...) 或 .ForEach();这就是问题[重复]

    这个问题在这里已经有答案了 可能的重复 C foreach 与函数式each https stackoverflow com questions 2024305 c sharp foreach vs functional each 这是一个
  • C# 中是否有一个好的浮点数基数排序实现

    我有一个带有浮点类型字段的数据结构 这些结构的集合需要按浮点值排序 是否有一个基数排序实现 如果没有 是否有一种快速的方法来访问指数 符号和尾数 因为如果你首先对尾数 指数和最后一次的指数对浮点数进行排序 您对浮点数进行排序的时间复杂度为
  • 是否有适用于触摸移动设备的 HTML5/ jQuery 球形全景查看器

    我需要将球形全景查看器放入 Web 应用程序中 最好是 HTML5 和 jQuery 用户必须能够使用手指在全景图中移动 有谁知道有类似的东西可以使用 只需支付少量费用或更好地免费 这是一个老问题 但对于现在找到它的人 像我一样 我认为 P
  • FirebaseImageLoader 不下载图像

    我正在尝试从 ViewHolder 内部的存储中下载图像 但它不起作用 FirebaseStorage storage FirebaseStorage getInstance StorageReference storageReferenc
  • 如何使用多色热图解决 MemoryError

    我试图通过从文件中读取数据来绘制具有多种颜色的热图 我可以很好地生成 2D 和法线热图 但无法绘制如附图所示的图像 当使用随机数时 我可以绘制此图 但在从文件中读取数据时 它显示错误 上面的热图是用随机数据生成的 Input col 1 a
  • 如何更改存储在字符串中的日期格式?目标c [重复]

    这个问题在这里已经有答案了 可能的重复 如何转换 NSString 中的日期时间格式 https stackoverflow com questions 2076417 how to convert datetime format in n
  • @use 即将推出,但此版本的 Dart Sass 不支持它

    我在跑步ng serve包含 Sass 的 Angular cli 项目 我一直在使用 import and include没有问题 当我添加时 use 终端抛出 use 即将推出 但此版本的 Dart 不支持它 萨斯 我的 package
  • 带列表框的 WPF ScrollViewer

    需要你的帮助 我有一个列表框 带有虚拟化 显示一个 ScrollViewer 我的列表框项目是可展开的 展开时它们的高度可能会超出可见的滚动区域 我遇到的问题是 当列表框项目超出可见滚动区域时 滚动会跳转到下一个列表框项目 而不是简单地滚动
  • 在 UITableView 的 header 中添加一个 UIButton

    我需要在动态填充的 UIViewTable 的正上方放置一个按钮 不填充第一个单元格 第 0 行 而是利用标题区域感觉是正确的 因此我使用 UITableViewDelegate 方法以编程方式创建一个包含 UIButton 的 UIVie
  • 如何在 Objective-C 中创建 NSNotification 对象?

    我想创建一个 NSNotification 对象 如下所示 NSNotification obj NSNotification alloc init 但是当我像这样创建时 我收到一个异常 NSConcreteNotification ini
  • 高性能QImage输出显示

    我正在尝试将视频输出 帧序列 到任何 qt 可见小部件 一开始我认为 QLabel 足以满足这一点 但我错了 对于处理大图像 例如 1080p 的处理器来说 转换为像素图过于过载 还有其他解决方案吗 不是QLabel 一帧的代码示例 QIm
  • java.lang.UnsupportedOperationException:无法将索引 5 处的值转换为颜色:type=0x5

    我的应用程序更新后崩溃了Android Studio 3 RC1 Gradle4 安卓Gradle插件 3 RC2 This is the error I am having java lang RuntimeException Unabl
  • g++:在涉及多个翻译单元的情况下 RVO 如何工作

    首先请看下面的代码 它由2个翻译单元组成 foo h class Foo public Foo Foo const Foo rhs void print const private std string str Foo getFoo foo
  • Spyder 绘制 Tkinter 后端无响应的图

    在spyder 4 以及使用3降级后 下绘图不起作用 我只是在做 data 1 2 3 plt plot data The output is a non responding frame After forcing to close it
  • 如何等到File.Exists?

    我有一个应用程序 正在侦听所选文件夹中的 log 文件 我用了FileSystemWatcher 但有一个问题 负责制作该文件的另一个应用程序采取以下步骤 制作一个 gz 文件 解压到txt文件 一些随机文件名 将 txt 名称更改为带有
  • 如何让客户端下载动态生成的非常大的文件

    我有一个导出功能 可以读取整个数据库并创建一个包含所有记录的 xls 文件 然后文件被发送到客户端 当然 导出完整数据库的时间需要大量时间 并且请求很快就会以超时错误结束 处理这种情况的最佳解决方案是什么 例如 我听说过使用 Redis 创