2013-06-01 12 views
15

Używam node.js i express w małym projekcie. I ustawić nagłówek odpowiedzi jak cios:Węzeł Express Content-Length

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

mogę używać długość console.log wydrukować dane jest 317.

Ale na konsoli przeglądarki, ja po prostu to:

Connection: keep-alive
Kodowanie treści: gzip
Content-Type: text/plain; charset = utf-8
Data: sob, 01 czerwca 2013 08:21:59 GMT
Transfer-Encoding: pakietowego
Vary: Accept-Encoding
X-Powered-By: ekspresowe

Więc dlaczego Content-Length zniknął?

Odpowiedz

29

Odpowiedź ma Transfer-Encoding: chunked. Tutaj Content-Length nie ma zastosowania, ponieważ treść jest wysyłana w jednej lub kilku częściach (porcjach) wewnątrz treści odpowiedzi, z znacznikiem wskazującym długość bajtów każdej porcji. http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js domyślnie jest to Transfer-Encoding: chunked. Jest to jednak wyłączone przez ustawienie nagłówka Content-Length w natywnym obiekcie odpowiedzi HTTP. Documentation of HTTP module mówi:

Wysłanie nagłówka "Długość treści" spowoduje wyłączenie domyślnego kodowania fragmentowanego.

Przechodzenie przez główką w swojej odpowiedzi Content-Encoding:gzip, prawdopodobnie umożliwiły connect.compress middleware. Środek pośredniczący connect.compress usuwa nagłówek Content-Length.

W każdym przypadku, jeśli sam generujesz spakowane treści gzip, wygenerowany nagłówek Content-Length na pewno byłby nieodpowiedni dla ostatecznego (spychanego gzipem) ciała odpowiedzi. Na szczęście oprogramowanie pośredniczące connect zajmuje się tym za Ciebie.

Korzystając z funkcji Express lub Connect, nie należy zakładać, że rzeczy, które "wysyłasz" za pomocą obiektu res, są wysyłane w ten sposób do klienta. Między nimi jest oprogramowanie pośrednie. Wszystkie oprogramowanie pośredniczące ma możliwość zmiany prawie wszystkiego, co dotyczy odpowiedzi, w tym zmiany treści odpowiedzi oraz dodawania, usuwania i zmieniania nagłówków. To samo dotyczy wniosku.

Zobacz także te pytania:

+0

Proszę o komentarz, dlaczego downvote? –

+2

Przepraszam, nie wiem, kto to zrobił, ale masz rację. Dziękuję Ci bardzo. Po komentarzu 'app.use (express.compress());' pojawia się długość treści. Ale czy mogę używać gzip i content-length zarówno? –

+0

@DMDGeeker, w zasadzie tak, możesz użyć 'Transfer-Encoding: gzip' i' Content-Length' razem.Jednak nie z oprogramowaniem pośredniczącym 'express.compress'. Po prostu tego nie obsługuje. W zasadzie wysyłanie nagłówka Content-Length jest preferowane, jeśli znasz długość odpowiedzi. Możesz sam kompresować zawartość lub szukać innego "kompresującego" oprogramowania pośredniego. Ale "Długość treści" musi odzwierciedlać faktyczną treść przesłaną. Musi odzwierciedlać długość bajtów ostatecznego (być może skompresowanego) ciała. –

Powiązane problemy