从响应nodejs发出数据后无法进行管道传输

时间:2015-07-23 11:50:05

标签: node.js pipe

我遇到了require节点js库的问题。当我尝试在响应时管道到文件和流时,我收到错误:you cannot pipe after data has been emitted from the response。这是因为我在真正管道数据之前做了一些计算。

示例:

var request = require('request')
var fs = require('fs')
var through2 = require('through2')

options = {
    url: 'url-to-fetch-a-file'
};

var req = request(options)
req.on('response',function(res){
    //Some computations to remove files potentially
    //These computations take quite somme time.
    //Function that creates path recursively
    createPath(path,function(){
        var file = fs.createWriteStream(path+fname)
        var stream = through2.obj(function (chunk, enc, callback) {
            this.push(chunk)
            callback()
        })

        req.pipe(file)
        req.pipe(stream)
    })
})

如果我只是在没有任何计算的情况下管道到流,那就没关系了。如何使用nodejs中的request模块管道传输文件和流?

我发现了这个:Node.js Piping the same readable stream into multiple (writable) targets但它不是一回事。在那里,管道在不同的刻度中发生2次。这个例子像问题中的答案一样管道,但仍然收到错误。

1 个答案:

答案 0 :(得分:0)

您可以向已定义的stream添加侦听器,而不是直接对文件进行管道传输。因此,您可以将req.pipe(file)替换为

stream.on('data',function(data){
    file.write(data)
})

stream.on('end',function(){
    file.end()
})

stream.pipe(file)

这将暂停流直到其读取,这是request模块不会发生的事情。

更多信息:https://github.com/request/request/issues/887