web-dev-qa-db-ja.com

Node Express Content-Length

私は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が消えたのですか?

24
Allen Heavey

応答には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オブジェクトで「送信」したものが実際にクライアントに送信されると想定しないでください。間にミドルウェアがあります。すべてのミドルウェアには、応答本体の変更、ヘッダーの追加、削除、変更など、応答に関するほぼすべてを変更する機能があります。リクエストについても同様です。

次の質問もご覧ください。

41
Myrne Stol