2017-06-19 11 views
0

に動作していないこれは、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を通じてURLを襲ったとき、私は取得"Hello World"と言っているシンプルなプレーンテキストですが、CURLはデフォルトで圧縮解除を行わないため、圧縮された文字列を取得する必要があります。 ChromeBrowserで同じURLにアクセスしたときにエラーが発生するERR_CONTENT_DECODING_FAILED

コンテンツのエンコーディングをgzipに設定すると、koa-compressは自分のレスポンステキストを圧縮していたはずですが、何もしません。多分私は間違いをしているのですが、私は何が分かりませんか?

答えて

1

私はもう一度、全体のプロセスを再テストし、私は私が設定されていないはず、それは圧縮ミドルウェア自体によって設定されるべきcontent-encodingを、手動で設定していたので、私のコードが機能していないことに気づきました。私はを間違えて、と答えると、その応答は常に圧縮されるべきです。しかし、多くの研究の結果、クライアントがAccept-Encodingというヘッダーを送信したときにだけ圧縮が機能するということが、今実現したことです。 Accept Accept-Encodingがgzipの場合、deflateの場合はgzipで圧縮され、deflateの場合は応答が圧縮され、記載されていない場合は単純なプレーンデータとなります。カールがデフォルトの要求にAccept-Encodingを送信しませんが、私は次のコード

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

を使用してカールリクエストを送信したときに、私は、圧縮形式の応答を受け取ったので、私はカールでプレーンテキストを受け取りました。だから私のコードは常に働いています。 content-encodingが設定されている場合は、私が

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

を設定する必要はありませんそれだけ、モジュールを実行して、エラー を生成しませんので、我々はそれが設定されなければならない、明示的にコンテンツ・エンコーディングを設定する必要はありません要求のAccept-Encodingに応じて圧縮ミドルウェアによって。

だから、応答に正しいコードは


ctx.body = 'Hello world' 
ctx.compress = true 
ctx.set('Content-Type', 'text/plain') 
を次のようにする必要があります