在我的nodejs应用程序中,我正在尝试读取http文件URL,然后以流方式下载该文件的内容。
我想做的是: - make to request to file resource(using node request module) - 当响应开始变得可用时,然后开始以块的形式读取数据,而不是将文件下载到磁盘..
我知道请求模块支持流式传输,我已经验证以下代码有效:
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 steams 2,但我不能在这里工作。触发了可读事件,但read操作返回null。我的用例是,我将阅读某种结构化数据,我将通过使用一些有限状态机一次读取一个字符来解析它。
那么,是否有任何阅读,而不是通过数据'事件
输出,尝试读取时。只接收可读事件,后续读取返回null。
rvnath@admin ~/downloader $ node download.js
now readable
修改 简而言之,我希望能够以streams2(基于拉取的流)方式使用传入的响应流,而不是流1(基于推送)类型。
答案 0 :(得分: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);
}
});
});