【问题标题】:Data event not firing Node.js数据事件未触发 Node.js
【发布时间】:2013-10-10 15:16:24
【问题描述】:

我正在编写一个应用程序,它使用扩展 node-ytdl 下载 YouTube 视频。我想向客户端发送一个下载进度指示器,所以我试图获取块信息来计算它。我的代码看起来像这样。

        var writing = fs.createWriteStream('video.mp4');
        var stream = ytdl('https://www.youtube.com/watch?v=jofNR_WkoCE', { filter: function(format) { return format.container === 'mp4'; }, quality: "lowest" });
        stream.pipe(writing);

        var completed_len = 0;
        var total_len = 0;

        writing.on('data', function(chunk) {
            console.log('received data!');
            completed_len += chunk.length;
        });

        writing.on('close', function ()
        {
            console.log('close');
            res.send('completed!');
        });

奇怪的是,即使下载完成时会触发“关闭”,我也没有从“数据”事件中获得任何日志。视频写得对。我对 Node.js 流有点陌生。我是不是做错了什么?

【问题讨论】:

    标签: javascript node.js youtube stream fs


    【解决方案1】:

    您刚刚绑定到错误的流。 'data' 事件将在 readable streams 上发生,例如 ytdl 创建的 stream

    stream.on('data', function (chunk) {
        // ...
    });
    

    如果您使用的是Node 0.8 或更早版本,两个流上都会发生'close' 事件。而 0.10 将可写流的事件更改为 'finish'

    【讨论】:

    • 你知道我在哪里可以得到流的总块长度吗?我知道它应该在响应标头中,但我不确定如何从流事件中获取它。
    • @J4G 这可能会成为一个很好的帖子。但是,一般来说,你现在如何实现它,总结个人的长度。流本身在开始时不一定具有固定长度,尽管某些实现可能会建议使用诸如 http.IncomingMessages 之类的长度。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多