如果没有调用res.end,http服务器无法处理新的请求?

时间:2017-12-26 23:26:37

标签: node.js

我有这段代码:

var http = require('http');
var count = 0;
var server = http.createServer(function(req, res) {
    //....
    if (req.url == '/') {
        count++;
        console.log('request' + count + ' enter:' + new Date())
        setTimeout(function() {
            res.end('response data');
            console.log('request' + count + ' leave:' + new Date())
        }, 3000)
        console.log('end')
    }
}).listen(3000)

然后我打开浏览器,打开三个标签快速访问我的服务器。

我的期望是:

request1 enter: ...
end
request2 enter: ...
end
request3 enter: ...
end
request1 leave: ...
request2 leave: ...
request3 leave: ...

但实际上是:

enter image description here

每个请求都被前一个请求阻止。

这是因为我在本地测试

有一些连接问题?

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

您的期望(几乎)正确。

那么为什么你没有收到正确的输出?它实际上是浏览器的行为。至少是chrome - 当我一次打开3个标签并从所有这些标签请求localhost:3000时,它没有发送3个请求 - 它只发送一个请求并在使用其他请求之前等待响应。

我一次使用了1个curl命令和1个chrome请求(这意味着我尽可能快地点击了这些)这就是发生的事情:

enter image description here

您期望不正确的唯一部分是当时“离开”回复的价值,“计数”对所有人来说都是相同的。

要获得精确所需的输出,您可以记住功能范围内的实际计数:

var http = require('http');
var count = 0;
var server = http.createServer(function(req, res) {
    //....
    if (req.url == '/') {
        count++;
        var requestCount = count;
        console.log('request' + requestCount + ' enter:' + new Date())
        setTimeout(function() {
            res.end('response data');
            console.log('request' + requestCount + ' leave:' + new Date())
        }, 3000)
        console.log('end')
    }
}).listen(3000)