Node Экспресс-длина контента

Я использую node.js и выражаю в небольшом проекте. Я устанавливаю заголовок ответа как удар:

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

Я могу использовать console.log длина данных печати - 317.

Но в консоли браузера я просто получаю следующее:

Connection: Keep-Alive
Content-Encoding: GZIP
Content-Type: текст/равнинный, кодировка = UTF-8
Дата: суббота, 01 июня 2013 08:21:59 GMT
Transfer-Encoding: фрагментированное
Vary: Accept-Encoding
X-Powered-By: Экспресс

Итак, почему длина содержимого исчезла?

Ответы

Ответ 1

Ответ имеет Transfer-Encoding: chunked. Здесь Content-Length неприменимо, поскольку содержимое отправляется в одной или нескольких частях (кусках) внутри тела ответа с маркером, указывающим длину байта каждого отдельного фрагмента. http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js по умолчанию - Transfer-Encoding: chunked. Однако это отключается установкой заголовка Content-Length в собственном HTTP-ответе. Документация HTTP-модуля говорит:

Отправка заголовка "Content-length" приведет к отключению кодированной по умолчанию кодировки.

Идя в заголовке Content-Encoding:gzip в вашем ответе, вы, вероятно, включили промежуточное программное обеспечение connect.compress. Средство connect.compress удаляет заголовок Content-Length.

В любом случае, если вы сами генерируете gzipped-контент, заголовок Content-Length, который вы создаете, наверняка будет неуместным для окончательного (gzipped) тела ответа. К счастью, промежуточное программное обеспечение для связи заботится об этом для вас.

При использовании Express или Connect вы не должны предполагать, что вещи, которые вы "отправляете" с объектом res, фактически отправляются клиенту. Там промежуточное ПО между ними. Все промежуточное ПО имеет возможность изменить практически все, что касается ответа, включая изменение тела ответа и добавление, удаление и изменение заголовков. То же самое касается запроса.

См. также следующие вопросы: