私はnode.jsを使用し、小さなプロジェクトで表現します。私はブローのような応答ヘッダーを設定しました:
res.set({'Content-Type':'text/plain;charset=utf-8',
'Content-Length': Buffer.byteLength(data, 'utf-8')});
使うことができます console.log
印刷データの長さは317です。
しかし、ブラウザのコンソールで、私はこれらを取得します:
接続:キープアライブ
Content-Encoding:gzip
Content-Type:text/plain; charset = utf-8
日付:土、2013年6月1日08:21:59 GMT
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:Express
では、なぜcontent-lengthが消えたのですか?
応答にはTransfer-Encoding: chunked
があります。ここではContent-Length
は適用されません。コンテンツは応答本文内の1つ以上の部分(チャンク)で送信され、マーカーは個々のチャンクのバイト長を示します。 http://en.wikipedia.org/wiki/Chunked_transfer_encoding
Node.jsのデフォルトはTransfer-Encoding: chunked
です。ただし、これはネイティブのhttp応答オブジェクトにContent-Length
ヘッダーを設定することで無効になります。 HTTPモジュールのドキュメント は言う:
「Content-length」ヘッダーを送信すると、デフォルトのチャンクエンコーディングが無効になります。
応答のContent-Encoding:gzip
ヘッダーを確認すると、connect.compress
ミドルウェアが有効になっている可能性があります。 connect.compress
ミドルウェアは、Content-Length
ヘッダーを削除します。
いずれにせよ、gzip圧縮されたコンテンツを自分で生成しない限り、自分で生成したContent-Length
ヘッダーは、最終的な(gzip圧縮された)応答本文には不適切です。幸いにも、接続ミドルウェアがそれを処理します。
ExpressまたはConnectを使用する場合、resオブジェクトで「送信」したものが実際にクライアントに送信されると想定しないでください。間にミドルウェアがあります。すべてのミドルウェアには、応答本体の変更、ヘッダーの追加、削除、変更など、応答に関するほぼすべてを変更する機能があります。リクエストについても同様です。
次の質問もご覧ください。