我需要从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;
}
        
             