为什么node.js表示服务器只处理每个客户端对同一路由的一个请求?

时间:2018-02-18 16:40:17

标签: node.js express

使用如下路由处理程序运行快速服务器:

  app.get('*', (req, res) => {
   console.log('Received request');

   setTimeout(() => {
     res.end();
     console.log('Ended request');
   }, 3000);
  });

如果有人访问路线' / foo'然后立即' / bar' (在两个不同的选项卡中),这将通过console.log输出:

Received request
Received request
Ended request
Ended request

但如果你这样做,除了访问' / foo'在两个选项卡中,服务器在处理第二个请求之前等待第一个请求:

Received request
Ended request
Received request
Ended request

我相信所有方法请求都是异步处理的,但这似乎是个例外。任何人都可以提供深入解释为什么会发生这种情况?我无法在快递文档中找到任何信息。

2 个答案:

答案 0 :(得分:1)

使用Windows 10 Node.js v8.1.3和Chrome以及MS Edge浏览器进行的测试显示了一些有趣的内容。使用原始发布的代码并使用Chrome发出http请求会产生与您描述的相同的延迟第二响应行为。修改代码以包括将响应写入请求客户端,如:

app.get('*', (req, res) => {
   console.log('Received request');
   res.write("Request received\n");
   setTimeout(() => {
       res.write("Ending request response");
       res.end();
       console.log('Ended request');
   }, 3000);
});

给出了预期的结果。

使用MS Edge进行第一个代码版本时,第一个和第二个http响应都没有延迟。基于此,看起来Brahma Dev关于浏览器缓存优化的评论是正确的。

答案 1 :(得分:0)

以下是我得到的结果以及Async(Node Way)

的结果

简化我已将代码修改为

app.get('*', (req, res) => {
  var requestURL = req.url;
  console.log('Received request : ' + requestURL + ' on Time : ' + new Date().toISOString());
  setTimeout(() => {
    res.end();
    console.log('Ended request : ' + requestURL + ' on Time : ' + new Date().toISOString());
  }, 15000);
});

我使用不同的标签和Firefox同时使用URLS作为

解雇了4个URL
  1. http://localhost:3000/footab1
  2. http://localhost:3000/bar
  3. http://localhost:3000/bar
  4. http://localhost:3000/booztab1
  5. 我们可以看到NodeJs正在触发所有唯一的URL的区别是在没有等待第一个请求完成的情况下即时触发,因此它的行为正常并且在我上面的测试中因为我使用了{{1}两次浏览器只调用一次因为您在两个选项卡中命中相同的端点

    如果您使用的是其他同步编程语言,例如PHP,JAVA,您会期望结果为/bar,那么您的第二个请求将会被处理

    Received request>Ended request