2017-04-22 35 views
0

我试图获取从远程服务器的PDF文件,并管他们的权利,返回给请求客户端之前意外关闭象下面这样:Node.js的readStream writeStream

var writeStream = fs.createWriteStream(filename); 
writeStream.on('close', function() { 
    console.log("Closed write stream"); 
}); 
writeStream.on('open', function() { 
    console.log('Open event for writestream'); 
}); 
writeStream.on('pipe', function() { 
    console.log('pipe event for writestream'); 
    var rd = fs.createReadStream(filename); 
    rd.on('open', function() { 
     console.log('Open event for readstream'); 
    }); 
    rd.on('close', function() { 
     console.log("Closed read stream"); 
    }).pipe(res); 
}); 
request(pQuestURL) 
    .on('error', function (err) { 
     console.log(err); 
     res.json({ status: -1, message: 'Maps error, check your parameters' }); 
    }) 
    .pipe(writeStream); 

但它给我的输出象下面这样:

pipe event for writestream 
Open event for writestream 
Open event for readstream 
Closed read stream 
Closed write stream 

我期待readstream只在writestream完成后才能完成。 readstream似乎立即关闭,因此我的客户端收到一个空的响应,而写入流只在下载完整的pdf后才结束。我的理解有没有漏洞?如何在不等待writestreamfinish事件的情况下向右回流?

编辑:

其实我可以保存读取流中的变量和管道它尽可能多的可写流,因为我想。我通过简化如下来完成了我的目标:

var mapRequest = request(pQuestURL); 
mapRequest.on('error', function (err) { 
    console.log(err); 
    res.json({ status: -1, message: 'Maps error, check your parameters' }); 
}); 
mapRequest.pipe(writeStream); 
mapRequest.pipe(res); 
+0

为什么你需要一个writeStream?不能只要求(pQuestURL).pipe(res); ???看起来你的readStream比writeStream更快,因为writeStream依赖于下载速度... –

+0

你是对的。我可以将可读流保存在一个变量中,并将其管道化为尽可能多的可写。现在编辑我的问题。谢谢 – user3677331

+0

和theres没有需要存储在您的服务器上的文件。它只会浪费资源... –

回答

2

主要问题是readStream更快,因为writeStream取决于下载速度。所以,你要么流直接用户:

request(pQuestURL).pipe(res); 

另外,您可以等待writeStreams数据事件,并检索writeStream的一大块。然而这在我看来是不必要的...

相关问题