2016-08-03 50 views
0

我想實現以下錯誤處理:當目標流發出錯誤事件時,我們可以以某種方式重用源流嗎?

  1. 說我們有一個readable流。
  2. 我們將其管入transform流。
  3. 不知怎的,transform流發出error
  4. 我們希望恢復readable流(及其所有數據),並將其重新導入另一個transform流。

步驟4似乎難以:我可以聽到目標流(transform流)unpipe事件和檢索到源流(readable流)基準,但是其數據中的至少一些塊已經丟失。

我們可以在不創建自定義轉換流的情況下做到這一點嗎?

真實世界的例子是deflate內容編碼,where in some cases,你需要zlib.createInflateRaw(),而不是zlib.createInflate(),但我們不能決定哪一個是正確的選擇,看響應體緩衝區之前。

+0

這些天不是大多數網站都支持gzip嗎?只需在您的請求中發送'Accept-Encoding:gzip',您就不必擔心任何泄漏問題。 – mscdex

+0

@mscdex你是對的,但對於一個http庫我們不能忽視那些老式和瘋狂的僅限於deflate的服務器,我最終這樣做,似乎是我目前能做的最好的。 https://github.com/bitinn/node-fetch/blob/master/index.js#L209-L222 – bitinn

回答

1

您不需要在中間引入一個流來讀取第一個字節。例如:

(function readChunk() { 
    var chunk = res.read(); 
    if (!chunk) 
    return res.once('readable', readChunk); 

    var inflate; 
    if ((chunk[0] & 0x0F) === 0x08) 
    inflate = zlib.createInflate(); 
    else 
    inflate = zlib.createInflateRaw(); 

    // Put chunk back into stream 
    res.unshift(chunk); 

    // Prepare the decompression 
    res.pipe(inflate); 

    output = new Response(inflate, response_options); 
    resolve(output); 
})(); 

此外,var body = res.pipe(new stream.PassThrough());是不必要的,你可以只使用res在適當情況下。

相關問題