我的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是否为应用程序中的每个路由创建单独的事件循环或调用堆栈?
我假设您的测试是在浏览器中进行的。如果是,则该行为与Node.js无关。
浏览器将识别到请求是同一个URL,并一次发送一个请求,因为服务器可能会响应缓存控制头,这将允许它重用第一个请求的响应作为后续请求的响应。