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

如何使用node.js和react.js下载大型CSV文件,node.js,reactjs,mongodb,Node.js,Reactjs,Mongodb,我想通过node.js从react下载一个Mongo集合(包含大量记录)作为CSV 目前我要做的是,首先将数据加载到节点,然后处理它们,然后解析它们。对于小型收藏,这很管用。但当记录数越来越高时,经过很长一段时间后返回502错误。最好的方法是什么?这是帮助我解决上述问题的基本代码spinet const collection = ... ; const query = ... ; const select = ... ; const cursor = mongo

我想通过node.js从react下载一个Mongo集合(包含大量记录)作为CSV


目前我要做的是,首先将数据加载到节点,然后处理它们,然后解析它们。对于小型收藏,这很管用。但当记录数越来越高时,经过很长一段时间后返回502错误。最好的方法是什么?

这是帮助我解决上述问题的基本代码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)
}

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

Redis连接

工作进程

var clusterWorkerSize=require('os').cpus().length;
var工人=[];
对于(var i=0;i
使用游标并使用管道流式传输响应。它适用于处理大型数据集,还可以防止内存泄漏导致系统崩溃。您可以在中查看示例,您可以解释这一行。管道(csv.transfer(transformer))
 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);
}