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

Javascript 在调用res.end之前,res.write-in-nodejs是否会阻止服务器响应其他请求?,javascript,node.js,express,Javascript,Node.js,Express,res.write和res.end之间的时间是否被阻止服务其他请求?我有一个简单的节点服务器,它在请求时执行red.write,在设置超时5秒后执行res.end。在这段时间里,我从不同的选项卡点击服务器,只有在第一个请求完成后,我才开始得到响应?为什么这么痛苦 更新: 我正在运行的代码 这是我正在运行的代码 var http = require('http'); http.createServer(function(request, response) { respo

res.write和res.end之间的时间是否被阻止服务其他请求?我有一个简单的节点服务器,它在请求时执行red.write,在设置超时5秒后执行res.end。在这段时间里,我从不同的选项卡点击服务器,只有在第一个请求完成后,我才开始得到响应?为什么这么痛苦

更新:

我正在运行的代码

这是我正在运行的代码

 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);
在延迟之后,您确实看不到这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);

浏览器将单个服务器的并发连接数限制在6个左右。如果您延迟发送响应,并且刚刚达到该限制,则任何新请求(例如,来自另一个选项卡)都可能会被阻止,直到延迟的请求被发送为止。尝试从另一个浏览器测试(你会发现它不会阻塞)。不,为什么会?每个请求都有自己的响应,并分别提供服务。节点的关键在于它的非阻塞性。在服务器端使用日志记录来查看何时收到请求以及何时响应请求。这将解决连接中的任何问题。您所说的字符在缓冲区填充之前不会被发送是什么意思?预期要填充的缓冲区大小是多少?不完全是。您是否尝试同时从两个不同的浏览器选项卡访问服务器?在这种情况下,在第一个选项卡完成后,即在第一个超时后,我在第二个选项卡中获得第一行本身。
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);
# dots with no newlines:
curl http://localhost:5000/0

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