【问题标题】:nodejs request - streaming a response filenodejs 请求 - 流式传输响应文件
【发布时间】:2016-08-31 10:46:27
【问题描述】:

在我的 nodejs 应用程序中,我试图读取一个 http 文件的 url,然后以流的方式下载该文件的内容。

我想做的是: - 请求文件资源(使用节点请求模块) - 当响应开始变得可用时,开始以块的形式读取数据,而不是将文件下载到磁盘..

我了解请求模块确实支持流式传输,并且我已验证以下代码有效:

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

});

但唯一的问题是,我无法控制“阅读我想阅读的内容”,因为“数据”事件提供了当时可用的任何内容。相反,我想做的是自己使用读取操作,就像上面 sn-p 中的 commented 代码一样。

这样的代码通常适用于 nodeJS steams 2,但我无法让它在这里工作。可读事件被触发,但读取操作返回 null。我的用例是,我要读取某种结构化数据,然后使用有限状态机一次读取一个字符来解析它。

那么,有什么可以阅读而不是通过“数据”事件通知的吗?

输出,尝试读取时。只接收到可读事件,后续读取返回null。

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

编辑 简而言之,我希望能够以流 2(基于拉的流)方式使用传入的响应流,而不是流 1(基于推)类型。

【问题讨论】:

    标签: node.js node-request


    【解决方案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);
        }
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多