В моем приложении 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).