在NodeJS中观看流式HTTP响应进度,表达

时间:2014-08-20 17:09:31

标签: node.js http stream coffeescript response

我想使用express@4.8.5和管道在NodeJS 0.10.x中流式传输大型文件。目前我正在 这样做(在CoffeeScript中):

app.get   '/', ( request, response ) ->
  input = P.create_readstream route
  input
    .pipe P.$split()
    .pipe P.$trim()
    .pipe P.$skip_empty()
    .pipe P.$skip_comments()
    .pipe P.$parse_csv headers: no, delimiter: '\t'
    .pipe response

Ppipedreams。)

我希望拥有的是

    .pipe count_bytes       # ???
    .pipe response
    .pipe report_progress response

所以当我查看终端中运行的服务器时,我会得到一些字节数的指示 被客户接受。现在,看到客户端装载多年没有了,这是非常烦人的 是否在一分钟或明天完成传播的任何迹象。

有没有中间件可以做到这一点?我无法找到任何。

哦,我必须在响应完成时调用任何东西吗?它现在看起来像是在自动化。

1 个答案:

答案 0 :(得分:0)

对于你的第二个问题,你不必关闭任何东西。 pipe函数为您处理所有事情,甚至对流进行限制(如果源流由于下载速度较慢而拥有的数据多于客户端可以处理的数据,它将暂停源流,直到客户端再次消耗源而不是通过完全读取源来使用一堆内存服务器端。

对于您的第一个问题,要在您的流上设置一些统计信息服务器端,您可以使用的是Transform流,例如:

var Transform = require('stream').Transform;
var util = require('util').inherits;

function StatsStream(ip, options) {
    Transform.call(this, options);
    this.ip = ip;
}

inherits(StatsStream, Transform);

StatsStream.prototype._transform = function(chunk, encoding, callback) {
    // here some bytes have been read from the source and are
    // ready to go to the destination, do your logging here
    console.log('flowing ', chunk.length, 'bytes to', this.ip);

    // then tell the tranform stream that the bytes it should
    // send to the destination is the same chunk you received...
    // (and that no error occured)
    callback(null, chunk);
};

然后在您的请求处理程序中,您可以管道(抱歉javascript):

input.pipe(new StatsStream(req.ip)).pipe(response)

我做到了这一点,所以要小心:)