Поддерживает ли Express.js отправку небуферизованных постепенно сбрасываемых ответов?

Структура Perl Catalyst позволяет отправлять постепенно сброшенный ответ по открытому соединению. Например, вы можете использовать write_fh() в Catalyst:: Response. Я начал использовать Node.js, и я не могу найти, как сделать эквивалент.

Если я хочу отправить большой файл CSV, порядка 200 мегабайт, это способ сделать это без буферизации всего CSV файла в памяти? Конечно, клиент будет тайм-аут, если вы не отправляете данные за определенное количество времени, так что обещание будет приятным, если... но все равно это сделать?

Когда я пытаюсь выполнить res.send(text) в обратном вызове, я получаю

Express
500 Error: This socket has been ended by the other party

И не кажется, что Express.js поддерживает явный socket.close() или что-то вроде ilk.

Вот пример,

exports.foo = function (res) {                          
  var query = client.query("SELECT * FROM naics.codes");
  query.on('row', function(row) {                       
    //console.log(row);                                 
    res.write("GOT A ROW");                             
  });                                                   
  query.on('end', function() {                          
    res.end();                                          
    client.end();                                       
  });                                                   
};                                                      

Я ожидал бы, что для отправки "GOT A ROW" выйдет за каждую строку, пока вызов client.end() не будет означать завершение.

Ответ 1

Express построен на собственном HTTP-модуле, что означает res - это экземпляр http.ServerResponse, который наследуется от записываемый поток. Тем не менее, вы можете сделать это:

app.get('/', function(req, res) {
  var stream = fs.createReadStream('./file.csv');
  stream.pipe(res);

  // or use event handlers
  stream.on('data', function(data) {
    res.write(data);
  });

  stream.on('end', function() {
    res.end();
  });
});

Причина, по которой вы не можете использовать метод res.send() в Express для потоков, состоит в том, что он автоматически будет использовать res.close() для вас.