2017-06-19 91 views
0

這是我的嵌入KOA-壓縮中間件KOA-壓縮不工作

app.use(compress({ 
    filter: function (content_type) { 
     return /text/i.test(content_type) 
    }, 
    threshold: 1, 
    flush: require('zlib').Z_SYNC_FLUSH 
})) 

而以下是我的響應發送代碼

ctx.body = 'Hello world' 
ctx.compress = true 
ctx.set('Content-Type', 'text/plain') 
ctx.set('content-encoding', 'gzip') 

代碼時,我通過捲曲打網址我得到一個簡單的純文本說「你好世界」,但我相信我應該有我得到了一個壓縮的字符串,因爲CURL默認不做解壓縮。當我在ChromeBrowser上點擊相同的URL時,出現如下錯誤:ERR_CONTENT_DECODING_FAILED

當我將內容編碼設置爲gzip時,koa-compress應該壓縮了我的響應文本,但它不知道怎麼做。也許我犯了一些錯誤,但我不知道是什麼?

回答

1

我剛剛重新測試了整個過程,我意識到我的代碼不工作,因爲我手動設置了content-encoding,我不應該設置它,它應該由壓縮中間件本身設置。我在錯誤,假設,應始終壓縮響應。但是我現在意識到,經過大量研究,只有當客戶端發送一個包含Accept-Encoding的標頭時,壓縮纔有效。如果支持的Accept-Encoding爲gzip,則響應將以gzip壓縮,如果它是deflate,則響應將以deflate的形式進行壓縮,如果沒有提及,則響應應該是簡單的明文數據。我被接收以捲曲普通文本,因爲捲曲並不在其默認請求發送Accept-Encoding,但使用下面的代碼

curl -H 'Accept-Encoding: gzip' -D - http://localhost:3000 

然後我接收壓縮形式的響應,當我發送捲曲請求。所以我的代碼一直在努力。只是,我不應已設置

ctx.set('content-encoding', 'gzip')

如果content-encoding設置,模塊將無法運行併產生錯誤 所以我們沒有明確設置內容編碼的,應當設置通過壓縮中間件取決於請求的Accept-Encoding

所以正確的代碼,以響應應該像下面


ctx.body = 'Hello world' 
ctx.compress = true 
ctx.set('Content-Type', 'text/plain')