使用如下路由处理程序运行快速服务器:
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
我相信所有方法请求都是异步处理的,但这似乎是个例外。任何人都可以提供深入解释为什么会发生这种情况?我无法在快递文档中找到任何信息。
答案 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我们可以看到NodeJs正在触发所有唯一的URL的区别是在没有等待第一个请求完成的情况下即时触发,因此它的行为正常并且在我上面的测试中因为我使用了{{1}两次浏览器只调用一次因为您在两个选项卡中命中相同的端点
如果您使用的是其他同步编程语言,例如PHP,JAVA,您会期望结果为/bar
,那么您的第二个请求将会被处理
Received request>Ended request