2013-06-01 14 views
15

Ich benutze node.js und Express bei einem kleinen Projekt. Ich habe Antwort-Header wie Schlag:Node Express Inhalt-Länge

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

I console.log Druckdaten der Länge 317. ist

Aber bei Browser-Konsole verwenden können, bekomme ich nur diese:

Verbindung: Keep-Alive-
Content-Encoding: gzip
Content-Type: text/plain; charset = utf-8
Datum: Sa, 1. Juni 2013 08.21.59 GMT
Transfer-Encoding: Chunked
Vary: Accept-Encoding
X-Powered-By:

So

Express, warum der Content-Length verschwunden?

Antwort

29

Die Antwort hat Transfer-Encoding: chunked. Hier Content-Length ist nicht anwendbar, da der Inhalt in einem oder mehreren Teilen (Chunks) innerhalb des Antworttextkörpers mit einem Marker gesendet wird, der die Byte-Länge jedes einzelnen Chunks angibt. http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js ist standardmäßig Transfer-Encoding: chunked. Dies wird jedoch deaktiviert, indem der Header Content-Length auf dem systemeigenen HTTP-Antwortobjekt festgelegt wird. Documentation of HTTP module sagt:

Senden eines Headers "Content-Länge" deaktiviert die standardmäßige Chunked-Codierung.

Going durch die Content-Encoding:gzip Header in Ihrer Antwort, haben Sie wahrscheinlich die connect.compress Middleware aktiviert. Die connect.compress Middleware entfernt den Header Content-Length.

In jedem Fall, es sei denn, Sie generieren gziped Inhalte selbst, wäre die Content-Length Header, die Sie selbst generieren, sicherlich nicht geeignet für die endgültige (gziped) Antworttext. Glücklicherweise kümmert sich die connect Middleware darum.

Wenn Sie Express oder Connect verwenden, sollten Sie nicht davon ausgehen, dass die Dinge, die Sie mit dem res-Objekt senden, auf diese Weise an den Client gesendet werden. Da ist Middleware dazwischen. Die gesamte Middleware hat die Möglichkeit, fast alles über die Antwort zu ändern, einschließlich des Änderns des Antworthauptteils und des Hinzufügens, Entfernens und Änderns von Überschriften. Gleiches gilt für die Anfrage.

Siehe auch diese Fragen:

+0

Bitte kommentieren, warum Sie downvote? –

+2

Tut mir leid, ich weiß nicht, wer das getan hat, aber Sie haben Recht. Vielen Dank. Nach dem Kommentar 'app.use (express.compress());' erscheint die Inhaltslänge. Aber kann ich sowohl gzip als auch content-length verwenden? –

+0

@DMDGeeker, im Prinzip ja, Sie können 'Transfer-Encoding: gzip' und' Content-Length' zusammen verwenden.Allerdings nicht mit der Middleware 'express.compress'. Das unterstützt das einfach nicht. Grundsätzlich ist das Senden eines Content-Length-Headers zu bevorzugen, wenn Sie die Antwortlänge kennen. Sie könnten Inhalte selbst komprimieren oder nach einer anderen "Komprimierungs" -Middleware suchen. Aber "Content-Length" muss den tatsächlich gesendeten Inhalt wiedergeben. Es muss die Bytelänge des endgültigen (vielleicht komprimierten) Körpers widerspiegeln. –

Verwandte Themen