gpt4 book ai didi

javascript - 在调用 res.end 之前,nodejs 中的 res.write 是否会阻止服务器响应其他请求?

转载 作者:行者123 更新时间:2023-11-30 15:49:58 25 4
gpt4 key购买 nike

res.write 和 res.end 之间的时间是否被阻止处理其他请求?我有一个简单的 Node 服务器,它根据请求执行 red.write,并在 setTimeout 为 5 秒后执行 res.end。在此期间,我从不同的选项卡访问服务器,只有在第一个请求完成后我才开始收到响应吗?为什么会令人痛心?

更新:

我正在运行的代码 I,

这是我正在运行的代码,

 var http = require('http');
http.createServer(function(request, response) {
response.setHeader('Connection', 'Transfer-Encoding');
response.setHeader('Content-Type', 'text/html; charset=utf-8');
response.setHeader('Transfer-Encoding', 'chunked');

response.write('hello');

setTimeout(function() {
response.write(' world!');
response.end();
}, 10000);

}).listen(8888);

最佳答案

如果不显示实际代码,则很难说出任何具体内容。我不完全确定你在问什么。您是说在给定请求中调用 res.end 之前您没有收到传递给 res.write 的消息,还是您的下一个请求没有在第一个完成之前开始吗?

我猜你可能遇到了什么,我希望它能让你走上正轨。考虑这个简单的程序:

var app = require('express')();
app.get('/:n/:t', (req, res) => {
for (var i = 0; i < req.params.n; i++) res.write('x');
setTimeout(() => res.end(), req.params.t);
});
app.listen(5000);

当你运行它时,你可以用 curl 连接到例如:

res.write 写入 5 个字符并在 1000 毫秒后调用 res.end,如下所示:

curl http://localhost:5000/5/1000

延迟后你确实不会看到那5个字符。

您可以尝试使用更多字符:

curl http://localhost:5000/1000/1000

有 1000 个字符,我仍然没有在超时之前得到它们。

但还有更多,比如 3000:

curl http://localhost:5000/3000/1000

我立即获取一些字符,然后等待超时,然后获取其余字符。

那是因为在缓冲区填满或连接关闭之前字符没有显示。但是这些字符会尽快发送,这可以通过 tcpdump 看到。只是 curl 在这里做了一些缓冲。

更新

你发布了你的代码,所以试试这个:

var http = require('http');
http.createServer(function(request, response) {
response.setHeader('Connection', 'Transfer-Encoding');
response.setHeader('Content-Type', 'text/html; charset=utf-8');
response.setHeader('Transfer-Encoding', 'chunked');

response.write('hello\n');

setTimeout(function() {
response.write(' world!');
response.end();
}, 10000);

}).listen(8888);

我在 hello 之后添加了 \n。现在至少 curl 在超时前显示 hello。见:

curl http://localhost:8888

这就是您要找的吗?

更好的例子

检查这个程序:

var app = require('express')();
app.get('/:n', (req, res) => {
for (let i = 0; i < 10; i++) {
setTimeout(() => res.write(req.params.n|0 ? '.\n' : '.'), 100 * i);
}
setTimeout(() => res.end('\n'), 1500);
});
app.listen(5000);

然后试试 curl 的那两个调用:

# dots with no newlines:
curl http://localhost:5000/0

# dots with newlines:
curl http://localhost:5000/1

关于javascript - 在调用 res.end 之前,nodejs 中的 res.write 是否会阻止服务器响应其他请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39532057/

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