我想通过node.js从React下载一个Mongo集合(具有大量记录)作为CSV。
当前我所要做的是,我先将数据加载到Node中,然后对它们进行处理后,我会解决promise。对于小型收藏,这很好用。但是,当记录数变高时,很长一段时间后它会返回502错误。最好的方法是什么?
答案 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);
}