这是我嵌入koa-compress中间件的代码
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点击URL时,我得到一个简单的纯文本说“Hello World”,但我相信我应该得到一个压缩字符串,因为CURL默认情况下不进行解压缩。当我在ChromeBrowser上点击相同的网址时,收到错误ERR_CONTENT_DECODING_FAILED
当我将内容编码设置为gzip时,koa-compress应该已经压缩了我的响应文本但是它不知道这样做了。也许我犯了一些错误,但我不知道是什么?
答案 0 :(得分:2)
我再一次重新测试了整个过程,我意识到我的代码无效,因为我手动设置content-encoding
,我不应该设置它,它应该由压缩中间件本身设置。我在假设中犯了错误,应该始终压缩响应。但是我现在意识到,经过大量研究后,压缩仅在客户端发送带有Accept-Encoding
的标头时起作用。如果支持Accept-Encoding为gzip
,则响应将以gzip压缩,如果它是deflate
,则响应应以deflate
形式压缩,如果未提及,则响应应为简单明文数据。我在curl中收到纯文本,因为curl不会在其默认请求中发送Accept-Encoding
,但是当我使用以下代码发送curl请求时
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')