我在Node.js应用程序中有一个路由,它需要大约10秒来响应每个请求。
router.get("/", async (req, res, next) => {
console.log("Service health request.", req.ip, new Date());
let response = { success: true, message: "Service is running!!" };
await wait(10000);
return res.json(response);
});
const wait = (milliseconds) => {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
当我同时向该路由发出多个请求时,我注意到每个请求都是按顺序执行的,第一个请求需要10秒才能完成,第二个请求需要20秒,第三个请求需要30秒,依此类推。
有趣的是,当我同时在应用程序中请求另一个路由时,它会被毫不延迟地处理,这让我相信这个问题是特定于正在讨论的路由的。
router.get("/status", async (req, res, next) => {
console.log("Any other route request.");
let response = { success: true, data: {} };
await wait(10000);
return res.json(response);
});
我想知道为什么我对这个特定路由的请求是按顺序处理的,而不是并发处理的。虽然我知道回调和异步编程可以帮助我实现并发处理。我读过关于Node.js的事件循环和它的单线程特性,但我不确定它与我的问题有什么关系。
有谁能解释一下为什么我对这个特定路由的请求是按顺序处理的吗?除了我主要关心的问题之外,我很好奇Node.js是否为应用程序中的每个路由创建了一个单独的事件循环或调用堆栈?
1条答案
按热度按时间o7jaxewo1#
我假设你的测试是在浏览器中进行的。如果是这样,那么行为与Node.js无关。
浏览器将识别出请求是针对同一URL的,并一次发送一个请求,因为服务器可能会使用缓存控制报头进行响应,这将允许它将第一个请求的响应重新用作后续请求的响应。