2015-07-10 6 views
5

В коллекции mongodb есть 20 000 записей. Я экспортирую все эти записи в csv. Я отправить частичный ответ, используя это:Nodejs посылает частичный ответ

res.writeHead(200, { 
        "Content-Type": "application/csv", 
        "Content-disposition": "attachment; filename='import.csv'" 
}); 

res.write(data + '0', "binary"); 

Приведенный выше код выполняется в пакете 500. Я заканчивающегося с помощью этого кода, когда все записи обрабатываются.

if (++responseCount == loopCount) { 
    res.end(); 
} 

Но я получил эту ошибку:

Не удается установить заголовки после их отправки.

Но я получаю файл, загруженный с 500 записями.

Вот мой полный код.

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

Вы возвращаете ответ до завершения пакетной операции. – bluesman

+0

Проблема решена сейчас. http://stackoverflow.com/questions/31339652/nodejs-send-partial-response/31398864#31398864 – Rohit

ответ

1

Это утверждение

res.writeHead(200, { 
        "Content-Type": "application/csv", 
        "Content-disposition": "attachment; filename='import.csv'" 
}); 

принадлежит заголовок секции, когда вам ответ является send.So, оно посылает заголовок.
res.end() также отправить заголовок.Таким образом, таким образом вы снова отправляете заголовок.

Пожалуйста, обратитесь это одно stackoverlflow Question


EDIT CODE:

data.pipe(resp); 
resp.end(); 

Пожалуйста, предоставьте это один для более pipe

+0

Я получил ошибку, даже если это условие не выполняется. – Rohit

2

Почему не только поток данных? Вы можете использовать функцию mongoose query.stream. Пример из документов:

// follows the nodejs 0.8 stream api 
Thing.find({ name: /^hello/ }).stream().pipe(res) 

Поток будет заботиться о потоке данных для вас. Как Node.js поток, вы можете также прослушивать событие:

// manual streaming 
var stream = Thing.find({ name: /^hello/ }).stream(); 

stream.on('data', function (doc) { 
    // do something with the mongoose document 
}).on('error', function (err) { 
    // handle the error 
}).on('close', function() { 
    // the stream is closed 
}); 
1
var exportData = function (req, res, next) { 

    res.writeHead(200, { 
     'Content-Type': 'application/csv', 
     'Content-Disposition': 'attachment; filename="import.csv"' 
    }); 

    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.end(); 
      } 

     }); 
    } 
}; 
+1

При отправке ответов, пожалуйста, добавьте некоторое объяснение в свой код. – MayorMonty

+0

Действительно. Некоторое объяснение кода должно быть в порядке. – MoshMage

+0

Будет ли запись отправлять данные мгновенно, как частичный ответ или записывать данные в буфер, ожидая отправки? –

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