2017-04-22 34 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的一大塊。然而這在我看來是不必要的...

相關問題