我需要从nodejs发送部分响应,但此代码不起作用. 它将立即从数据库中获取500条记录,然后逐个处理每条记录.我想从node.js发送部分响应.如果我将数据存储在数组中,则会发生缓冲区溢出错
它将立即从数据库中获取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(); } }); } };来自评论:
你应该尝试流媒体.你的问题很可能是因为你的内存不足而一次加载了很多记录 – 你说你得到溢出异常,所以情况可能就是这样.这是使用express / http.Server进行流式传输的示例.我无法保证它的工作原理,因为我从未使用过express / http.Server的流媒体,但它应该给你一个起点.
请注意,您输入结果的任何内容都必须是字符串.
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; }