【问题标题】:Node Express Content-LengthNode Express 内容长度
【发布时间】:2013-05-28 01:53:38
【问题描述】:

我使用 node.js 并在一个小项目中表达。我设置了像打击一样的响应头:

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

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

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

连接:保持活动状态
内容编码:gzip
内容类型:text/plain;charset=utf-8
日期:2013 年 6 月 1 日星期六 08:21:59 GMT
传输编码:分块
变化:接受编码
X-Powered-By:Express

那么,为什么 content-length 消失了?

【问题讨论】:

    标签: node.js express content-length


    【解决方案1】:

    回复有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-length”标头将禁用默认的分块编码。

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

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

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

    另请参阅以下问题:

    【讨论】:

    • 抱歉,我不知道是谁投了反对票,但你是对的。非常感谢。评论app.use(express.compress());后,出现content-length。但是,我可以同时使用 gzip 和 content-length 吗?
    • @DMDGeeker,原则上是的,你可以同时使用Transfer-Encoding: gzipContent-Length。但是,不适用于 express.compress 中间件。它只是不支持。原则上,如果您知道响应长度,则首选发送 Content-Length 标头。您可以自己压缩内容或寻找不同的“压缩”中间件。但Content-Length 必须反映发送的实际内容。它必须反映最终(可能是压缩的)正文的字节长度。
    • connect.compress 没有在响应中添加新的Content-Length 的原因是它需要缓冲压缩的响应正文。毕竟,只有当缓冲区完成时,才能知道内容长度。
    • 如果您自己使用zlib.gzip gzip 缓冲区然后执行res.set ({"Transfer-Encoding": "gzip"}),则connect.compress 中间件不会触及它。
    • 谢谢。我会试一试的。
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 2012-11-03
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2016-04-23
    • 2010-10-17
    相关资源
    最近更新 更多