如何使用node.js和react.js下载大型CSV文件

时间:2019-06-07 05:28:13

标签: node.js reactjs mongodb

我想通过node.js从React下载一个Mongo集合(具有大量记录)作为CSV。

当前我所要做的是,我先将数据加载到Node中,然后对它们进行处理后,我会解决promise。对于小型收藏,这很好用。但是,当记录数变高时,很长一段时间后它会返回502错误。最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

这是一个基本的代码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)
}

答案 1 :(得分:0)

将流程拆分为多个部分并利用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);
}