запрос nodejs - потоковая передача файла ответа

В моем приложении nodejs я пытаюсь прочитать URL-адрес http-файла, а затем загрузить содержимое этого файла в потоковом режиме.

Что я хочу сделать, так это: - сделать запрос к файловому ресурсу (используя модуль запроса узла) - когда ответ станет доступным, тогда начните читать данные кусками, а не загружайте файл на диск.

Я понимаю, что модуль запроса поддерживает потоковую передачу, и я убедился, что приведенный ниже код работает:

var request = require('request');

var fileUrl = "http://172.19.2.48:8080/files/1472628282006/valid.txt";

request(fileUrl, function(err, response, body) {})
.on('response', function(response) {

  /*
  response.on('readable', function() {
    console.log("now readable");
    var ch;
    while ((ch=response.read(1))!== null) {
      console.log("char:", ch);
    }
  });
  */

  response.on('data', function(data) {
    console.log('data: ', data.toString());
  });

});

Но единственная проблема в том, что у меня нет контроля над «чтением того, сколько я хочу прочитать», поскольку событие «данные» дает все, что доступно на тот момент времени. Вместо этого я хотел сделать что-то вроде самостоятельной операции чтения, как в закомментированном коде в приведенном выше фрагменте.

Такой код обычно работает для паров nodeJS 2, но я не могу заставить его работать здесь. Событие readable запускается, но операция чтения возвращает null. Мой вариант использования: я собираюсь прочитать какие-то структурированные данные и разобрать их, прочитав символ за раз, используя некоторый конечный автомат.

Итак, есть ли что читать, а не получать уведомления о событии «данные»?

вывод при попытке чтения. Получено только читаемое событие, последующие операции чтения возвращают значение null.

rvnath@admin ~/downloader $ node download.js
now readable

Редактировать В двух словах, я хочу иметь возможность использовать входящий ответный поток в виде потоков 2 (поток на основе извлечения), а не типа потоков 1 (на основе push).


person Mopparthy Ravindranath    schedule 31.08.2016    source источник


Ответы (1)


Проблема в том, что поток находится в потоковом режиме, поэтому все данные считываются автоматически. Может быть, вы можете попробовать это:

request(fileUrl, function(err, response, body) {})
.on('response', function(response) {
  response.pause(); // <-- Pauses stream so you can pull data on demand
  response.on('readable', function() {
    console.log("now readable");
    var ch;
    while ((ch=response.read(1))!== null) {
      console.log("char:", ch);
    }
  });
});
person Vasan    schedule 31.08.2016