gpt4 book ai didi

node.js - 如何在输出之前禁用 res.writeHead() 输出额外的数字?

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:12 26 4
gpt4 key购买 nike

我用express创建了一个http服务器。下面是服务器代码:

router.get('/', function(req, res, next) {
// req.socket.setTimeout(Infinity);
res.writeHead(200, {
'Content-Type': 'text/plain; charset=utf-8', // <- Important headers
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
});
res.write('hell');
res.write('world');
res.end();

// res.write('\n\n');
// response = res;
});

当我使用 netcat 获取 url 时。输出是这样的

GET /sse HTTP/1.1

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/plain; charset=utf-8
Cache-Control: no-cache
Expires: 0
Connection: keep-alive
Keep-Alive: timeout=5, max=97
Date: Fri, 30 Jun 2017 11:50:00 GMT
Transfer-Encoding: chunked

4
hell
5
world
0

我的问题是为什么每个 res.write() 之前总是有一个数字?这个数字似乎就是 res.write 输出的长度。

如何删除该号码?

最佳答案

这就是分块编码的工作原理。您不必预先声明要发送多少字节,而是每个 block 都前面加上它所具有的字节数。例如:4 代表“hell”,5 代表“world”,最后0 代表“没有更多字节要发送”。

您可以看到存在分块编码 header :

Transfer-Encoding: chunked

现在,要直接回答您的问题,要删除您必须关闭分块编码的数字。为此,您必须将 Content-length header 设置为您要在响应正文中发送的字节数。

例如:

app.get('/', function(req, res, next) {
res.writeHead(200, {
'Content-Type': 'text/plain; charset=utf-8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-length': 9, // <<<--- NOTE HERE
});
res.write('hell');
res.write('world');
res.end();
});

(当然,在实际代码中,您必须计算响应的长度,或者构建一个字符串或缓冲区并在设置 Content-length header 之前获取其长度。)

但请注意,如果您使用curl或任何其他HTTP客户端,那么它会为您“删除”这些数字。只是在使用 netcat 时,您无意中看到了分块编码的底层实现细节,但所有真正的 HTTP 客户端都可以很好地处理它。

通常在 HTTP 中,您在 header 中声明整个响应的长度,然后发送正文(以一件、多个 block 的形式发送),但它必须与您声明的长度相同。这意味着在您知道要发送的所有内容的长度之前,您无法开始发送数据。使用分块编码,声明您发送的每个 block 的长度就足够了,但您不必知道整个响应的长度 - 甚至可以是无限的,这取决于您。它可以让您在有任何要发送的内容后立即开始发送,这非常有用。

关于node.js - 如何在输出之前禁用 res.writeHead() 输出额外的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44846020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com