You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会等待前一个请求响应后才发送下一个,造成串行的假象。

正确验证并发的方式:

  1. 用多个浏览器窗口/标签页同时访问http://localhost:8001,控制台会几乎同时打印多条route called,10秒后所有请求一起返回响应,说明请求是并发处理的。
  2. 用脚本批量发起请求,比如:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:41:07