2013-06-01 34 views
15

Tôi sử dụng node.js và thể hiện tại một dự án nhỏ. Tôi đặt tiêu đề phản ứng như đòn:Node Express Content-Length

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

tôi có thể sử dụng dài console.log dữ liệu in là 317.

Nhưng tại giao diện điều khiển của trình duyệt, tôi chỉ nhận được những:

kết nối: giữ-sống
Nội dung Mã hóa: gzip
Loại nội dung: văn bản/đồng bằng; charset = utf-8
Ngày: Sat, 01 Jun 2013 08:21:59 GMT
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Powered-By: Thể hiện

Vì vậy, tại sao nội dung dài biến mất?

Trả lời

29

Câu trả lời có Transfer-Encoding: chunked. Ở đây Content-Length không áp dụng được, bởi vì nội dung được gửi trong một hoặc nhiều phần (khối) bên trong thân phản hồi, với một điểm đánh dấu chỉ ra độ dài byte của mỗi đoạn riêng lẻ. http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js mặc định là Transfer-Encoding: chunked. Tuy nhiên, điều này bị tắt bằng cách đặt tiêu đề Content-Length trên đối tượng phản hồi http gốc. Documentation of HTTP module nói:

Gửi tiêu đề một 'Content-length' sẽ vô hiệu hóa mặc định chunked mã hóa.

Đi theo tiêu đề Content-Encoding:gzip trong phản hồi của bạn, có thể bạn đã bật phần mềm trung gian connect.compress. Thiết bị trung gian connect.compress loại bỏ tiêu đề Content-Length.

Trong mọi trường hợp, trừ khi bạn tự tạo nội dung gzipped, tiêu đề Content-Length bạn tự tạo ra chắc chắn sẽ không phù hợp cho phần trả lời cuối cùng (gzipped). May mắn thay, phần mềm trung gian kết nối sẽ chăm sóc nó cho bạn.

Khi sử dụng Express hoặc Connect, bạn không nên giả định rằng những thứ bạn "gửi" với đối tượng res thực sự được gửi theo cách đó tới máy khách. Có phần giữa ở giữa. Tất cả phần mềm trung gian đều có khả năng thay đổi mọi thứ về phản hồi, bao gồm thay đổi nội dung phản hồi và thêm, xóa và thay đổi tiêu đề. Cùng đi cho yêu cầu.

Xem thêm những câu hỏi này:

+0

hãy bình luận lý do tại sao bạn downvote? –

+2

Xin lỗi, tôi không biết ai đã làm điều này, nhưng bạn nói đúng. Cảm ơn nhiều. Sau khi bình luận 'app.use (express.compress());', chiều dài nội dung xuất hiện. Nhưng, tôi có thể sử dụng gzip và chiều dài nội dung cả hai không? –

+0

@DMDGeeker, về nguyên tắc, có, bạn có thể sử dụng 'Chuyển mã hóa: gzip' và' Nội dung dài 'với nhau.Tuy nhiên, không phải với phần mềm trung gian 'express.compress'. Nó không hỗ trợ điều đó. Về nguyên tắc, việc gửi tiêu đề Content-Length được ưu tiên nếu bạn có thể biết độ dài phản hồi. Bạn có thể tự nén nội dung hoặc tìm phần mềm trung gian "nén" khác nhau. Nhưng 'Content-Length' phải phản ánh nội dung thực được gửi. Nó phải phản ánh độ dài byte của phần tử cuối cùng (có thể được nén). –

Các vấn đề liên quan