Koa-compress不起作用

时间:2017-06-19 04:51:46

标签: node.js koa koa2

这是我嵌入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应该已经压缩了我的响应文本但是它不知道这样做了。也许我犯了一些错误,但我不知道是什么?

1 个答案:

答案 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')