32

我使用 node.js 并在一个小项目中表达。我将响应标头设置为打击:

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

我可以使用console.log打印数据的长度为 317。

但是在浏览器的控制台上,我得到了这些:

连接:keep-alive
内容编码:gzip
内容类型:text/plain;charset=utf-8
日期:星期六,2013 年 6 月 1 日 08:21:59 GMT
传输编码: chunked
Vary:Accept-Encoding
X-Powered-作者:快递

那么,为什么内容长度消失了?

4

1 回答 1

51

回应有Transfer-Encoding: chunked。这里Content-Length不适用,因为内容是在响应正文内的一个或多个部分(块)中发送的,并带有一个指示每个单独块的字节长度的标记。http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Node.js 默认为Transfer-Encoding: chunked. 但是,可以通过Content-Length在本机 http 响应对象上设置标头来禁用此功能。HTTP模块的文档说:

发送“内容长度”标头将禁用默认的分块编码。

通过Content-Encoding:gzip响应中的标题,您可能已经启用了connect.compress中间件。connect.compress中间件删除标Content-Length头。

在任何情况下,除非您自己生成压缩内容,否则您自己Content-Length生成的标头肯定不适合最终(压缩)响应正文。幸运的是,connect 中间件会为您解决这个问题。

使用 Express 或 Connect 时,您不应假设您使用 res 对象“发送”的内容实际上是以这种方式发送到客户端的。中间有中间件。所有中间件都能够更改响应的任何内容,包括更改响应正文,以及添加、删除和更改标头。请求也是如此。

另请参阅以下问题:

于 2013-06-01T10:53:29.343 回答