【问题标题】:How to Download a Large CSV file with node.js and react.js如何使用 node.js 和 react.js 下载大型 CSV 文件
【发布时间】:2019-10-22 14:43:36
【问题描述】:

我想通过 node.js 以 CSV 格式下载 Mongo 集合(包含大量记录)。

目前我所做的是,我首先将数据加载到节点中,然后在处理它们之后解决承诺。对于小型收藏,这很好用。但是当记录数越来越多时,它会在很长一段时间后返回 502 错误。最好的方法是什么?

【问题讨论】:

  • 使用游标并通过管道流式传输响应。它适用于处理大型数据集,也可以防止内存泄漏导致系统崩溃。
  • 你可以看看itnext.io/…中的例子

标签: node.js reactjs mongodb


【解决方案1】:

这是帮助我解决上述问题的基本代码spinet。

    const collection = ... ;
    const query = ... ;
    const select = ... ;

    const cursor = mongodb.collection(collection).find(query, select)

    var csv = require('csv');

    transfer(doc) {
    return {
        Address: doc.address,
        State: doc.state.abbreviation
    };
    }

    function(req, resp) {
    const cursor = ...
    // The transfer function (above)
    const transfer = ...;

    const fileName = "Download.csv";

    resp.setHeader('Content-disposition', `attachment; fileame=${fileName}`);
    resp.writeHead(200, { 'Content-Type': 'text/csv' });

    resp.flushHeaders();

    // Stream the query result 
    cursor.stream()
        .pipe(csv.transfer(transformer))
        .pipe(csv.stringify({header: true}))
        .pipe(resp)
}

【讨论】:

  • 你能解释一下这行吗.pipe(csv.transfer(transformer))
【解决方案2】:

将流程拆分为多个部分并使用 Redis。解析 CSV 并将每个作业推送到 Redis 队列。并行启动新的工作进程以从队列中获取作业并进行处理。如果您的系统有多个核心,您可以使用集群模块来拆分工作进程。请注意,进程没有共享内存。

Redis 连接

 var kue = require("kue");

     var queue = kue.createQueue(
      {
        redis: `redis://${redisHost}:${redisPort}`,
        jobEvents: false
      }
    );

工作进程

var clusterWorkerSize = require('os').cpus().length;
var workers = [];
for (var i = 0; i < clusterWorkerSize; i++) {
        var worker = cluster.fork();
        workers.push(worker);
}

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2012-04-28
    • 2020-10-25
    • 2017-11-24
    • 2019-09-21
    • 2019-03-17
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多