我需要从nodejs发送部分响应,但此代码无效。 它将立即从数据库中获取500条记录,然后逐个处理每条记录。我想从node.js发送部分响应。如果我将数据存储在数组中,则会发生缓冲区溢出错误。
var exportData = function (req, res, next) {
var limit = 500;
var responseCount = 0;
var loopCount = 1;
var size = 30000;
//Get 500 records at one time
var getData = function (req, start, cb) {
req.db.collection('items').find().skip(start).limit(limit).toArray(function (err, records) {
if (err) throw err;
cb(null, records);
});
};
if (size > limit) {
loopCount = parseInt(req.size / limit);
if ((req.size % limit) != 0) {
loopCount += 1;
}
}
for (var j = 0; j < loopCount; j++) {
getData(req, limit * j, function (err, records) {
if (err) throw err;
records.forEach(function (record) {
//Process record one by one
});
res.write(records);
if (++responseCount == loopCount) {
res.setHeader('Content-type', 'application/csv');
res.setHeader("Content-disposition", 'attachment; filename="import.csv"');
res.end();
}
});
}
};
答案 0 :(得分:0)
来自评论: 你应该尝试流媒体。你的问题很可能是因为你的内存不足而一次加载了很多记录 - 你说你得到溢出异常,所以情况可能就是这样。这是使用express / http.Server进行流式传输的示例。我不能保证它有效,因为我从来没有使用过express / http.Server的流媒体,但它应该给你一个起点。
请注意,您输入result
的任何内容必须为字符串。
var through = require('through');
function exportData(request, result) {
var limit = 500;
res.setHeader('Content-type', 'application/csv');
res.setHeader('Content-disposition', 'attachment: filename="import.csv"');
req.db.collection('items')
.find()
.limit(limit)
.stream()
.pipe(through(function(record) {
var processedRecord = processRecord(record);
this.write(processedRecord);
}))
.pipe(result);
}
function processRecord(record) {
// process record one by one
return record;
}