2013-06-01 86 views
15

我使用node.js並在一個小項目中表達。我設置響應頭象的打擊:Node Express Content-Length

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

我可以使用console.log打印數據的長度爲317

但在瀏覽器的控制檯,我只是讓這些:

連接:保持活躍
內容編號gzip
Content-Type:text/plain; charset = utf-8
Date:Sat,01 Jun 2013 08:21:59 GMT
傳輸編碼:分塊
有所不同:接受編碼
X供電-者:快速

那麼,爲什麼內容長度消失了?

回答

29

回覆有Transfer-Encoding: chunked。這裏Content-Length不適用,因爲內容是在響應主體內的一個或多個部分(塊)中發送的,標記指示每個單獨塊的字節長度。 http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js默認爲Transfer-Encoding: chunked。但是,通過在本機http響應對象上設置Content-Length標頭,將禁用此功能。 Documentation of HTTP module說:

發送'內容長度'標題將禁用默認分塊編碼。

在您的回覆中,通過Content-Encoding:gzip標題,您可能已啓用connect.compress中間件。 connect.compress中間件刪除了Content-Length標題。

在任何情況下,除非您自己生成gzip內容,否則您自己生成的Content-Length標頭肯定不適合最終(壓縮)的響應正文。幸運的是,連接中間件爲您處理。

使用Express或Connect時,您不應該認爲用res對象「發送」的內容實際上是以這種方式發送給客戶端的。中間有中間件。所有中間件都可以改變響應的任何內容,包括更改響應主體,添加,刪除和更改標題。請求也一樣。

參見下列問題:

+0

請評論你爲什麼downvote? –

+2

對不起,我不知道這是誰做的,但是你是對的。非常感謝你。在評論'app.use(express.compress());'後,內容長度出現。但是,我可以使用gzip和內容長度嗎? –

+0

@DMDGeeker,原則上是的,你可以一起使用'Transfer-Encoding:gzip'和'Content-Length'。但是,不能使用'express.compress'中間件。它只是不支持。原則上,如果您知道響應長度,則首選發送Content-Length標頭。你可以自己壓縮內容或尋找不同的「壓縮」中間件。但是'Content-Length'必須反映發送的實際內容。它必須反映最終(可能是壓縮的)主體的字節長度。 –