Express中使用async/await时请求未并发处理问题咨询
问题:Express/Node.js中async/await下请求未并发?
我了解到在Express/Node.js环境中,即便使用async/await,请求也应该被并发处理。但测试后发现服务器会等待当前请求完成后才处理下一个,测试代码如下:
const express = require('express'); const app = express(); // 用非阻塞等待模拟长异步操作 async function longAsyncOperation() { return new Promise(resolve => setTimeout(resolve, 10000)); // 10秒延迟 } app.get('*', async function (req, res) { console.log("route called"); try { await longAsyncOperation(); // 模拟长异步操作 res.send("route resolved"); } catch (error) { res.send("route rejected"); } }) app.listen(8001, () => { console.log("Server running on port 8001"); })
原因分析及验证
你的代码逻辑本身没问题,Node.js的事件循环机制下,异步操作(比如setTimeout)不会阻塞其他请求的处理。你觉得请求串行,大概率是测试方式导致的:
- 若用同一个浏览器标签页连续发起请求,浏览器会对同一域名的重复请求做排队限制,比如Chrome会等待前一个请求响应后才发送下一个,造成串行的假象。
正确验证并发的方式:
- 用多个浏览器窗口/标签页同时访问
http://localhost:8001,控制台会几乎同时打印多条route called,10秒后所有请求一起返回响应,说明请求是并发处理的。 - 用脚本批量发起请求,比如:
const axios = require('axios'); async function testConcurrent() { const requests = []; // 同时发起3个请求 for (let i = 0; i < 3; i++) { requests.push(axios.get('http://localhost:8001')); } // 等待所有请求完成 const responses = await Promise.all(requests); responses.forEach(res => console.log(res.data)); } testConcurrent();
运行这个脚本,你会看到服务器瞬间接收3个请求,10秒后同时返回结果。
原理说明
Node.js是单线程处理事件循环,但异步任务(如setTimeout)会被放到后台执行,此时事件循环会空闲出来处理新的请求。当多个请求进入await longAsyncOperation()时,它们的异步任务会同时在后台等待,不会互相阻塞,这就是请求能并发处理的核心原因。
内容的提问来源于stack exchange,提问作者tony_merguez
相关产品推荐
相关产品推荐

