2015-07-13 4 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

Thats ... впечатляет. На каком оборудовании вы тестируете это? –

+0

Ubuntu с памятью 4 ГБ – Rohit

Смежные вопросы