2013-06-01 3 views
15

私はnode.jsを使用し、小さなプロジェクトで表現します。私は、ブローのようなレスポンスヘッダを設定します。ノードエクスプレスコンテンツ長

res.set({'Content-Type':'text/plain;charset=utf-8',  
'Content-Length': Buffer.byteLength(data, 'utf-8')});  

私はconsole.log印刷データの長さを使用することができます317

である。しかし、ブラウザのコンソールで、私はこれらを取得する:

接続:キープアライブ
コンテンツエンコーディング:gzip
コンテンツタイプ:text/plain; charset = utf-8
日付:土曜日、01 Jun 2013 08:21:59 GMT
転送 - エンコード:
はヴァリチャンク:
X-パワード・バイ・エンコードを受け入れ:だからエクスプレス

、なぜコンテンツ長が消えましたか?

答えて

29

応答はTransfer-Encoding: chunkedです。ここではContent-Lengthは適用されません。なぜなら、コンテンツはレスポンス本文内の1つ以上の部分(チャンク)で送信され、マーカーは個々のチャンクのバイト長を示します。 http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.jsのデフォルトはTransfer-Encoding: chunkedです。ただし、ネイティブhttp応答オブジェクトにContent-Lengthヘッダーを設定すると、これは無効になります。 Documentation of HTTP module

「Content-length」ヘッダーを送信すると、デフォルトのチャンクエンコーディングが無効になります。あなたの応答にContent-Encoding:gzipヘッダーで行く

、あなたはおそらくconnect.compressミドルウェアを有効にしています。 connect.compressミドルウェアは、Content-Lengthヘッダーを削除します。

gzip形式のコンテンツを自分で生成しない限り、自分で生成するContent-Lengthヘッダーは、最終的な(gzipped)レスポンス本体には不適切です。幸いなことに、接続ミドルウェアがそれを処理します。

ExpressまたはConnectを使用しているときは、resオブジェクトで「送信」するものが実際にクライアントに送信されると想定してはいけません。間にミドルウェアがあります。すべてのミドルウェアには、応答本文の変更、ヘッダーの追加、削除、変更など、応答について何かを変更する機能があります。リクエストにも同じことが起こります。あなたはdownvoteなぜ

+0

はコメントしてください:

は、これらの質問を参照してください? –

+2

申し訳ありませんが、私は誰がこのdownvoteをしたのか分かりませんが、あなたは正しいです。どうもありがとうございました。コメント 'app.use(express.compress());'の後、content-lengthが表示されます。しかし、gzipとcontent-lengthの両方を使用できますか? –

+0

@DMDGeeker、原則として、あなたは 'Transfer-Encoding:gzip'と' Content-Length'を一緒に使うことができます。しかし、 'express.compress'ミドルウェアではありません。それだけではそれをサポートしていません。原則として、レスポンスの長さを知ることができれば、Content-Lengthヘッダーを送信することをお勧めします。コンテンツを自分で圧縮したり、さまざまな "圧縮"ミドルウェアを探すことができます。しかし、 'Content-Length'は送信された実際の内容を反映しなければなりません。最終的な(おそらく圧縮された)ボディのバイト長を反映しなければなりません。 –