2015-07-13 57 views
4

我需要發送來自nodejs的部分響應,但此代碼不起作用。 一次它將從數據庫中取出500條記錄,然後逐個處理每條記錄。我想發送來自node.js的部分響應。如果我將數據存儲在數組中,則會發生緩衝區溢出錯誤。Nodejs發送部分響應不起作用

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

也許你應該在調用'res.write'之前設置標題? – marekful

+0

我也試過這個東西,但它不起作用 – Rohit

+0

你應該嘗試流式傳輸響應。除非您需要將請求以X組的形式批處理,否則您可以使用'through' /'through2'輕鬆地將每個項目從貓鼬處理到處理邏輯,並將其傳送到響應中。 –

回答

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; 
} 
+0

我得到這個錯誤 - > RangeError:超過最大調用堆棧大小 – Rohit

+0

那......令人印象深刻。你在測試什麼硬件? –

+0

Ubuntu與4GB內存 – Rohit