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

浏览器是否默认设置未响应请求超时关闭?实测请求长期Pending

浏览器未响应请求的默认行为与解决方案

浏览器默认不会主动关闭长时间未响应的HTTP请求,你测试中看到的请求一直处于Pending状态是标准默认行为。

原因说明

HTTP协议本身没有强制要求客户端设置请求超时,主流浏览器(Chrome、Edge、Firefox)也没有内置的全局强制超时规则。只有当底层TCP连接出现异常(比如服务器主动断开、网络中断)时,浏览器才会终止请求并触发错误回调。如果服务器一直保持连接但不返回任何响应,请求会持续处于挂起状态。

结合你的代码来看:你的Express服务器端点没有执行任何响应逻辑(既不发送数据,也不调用res.end()/res.send()等方法结束请求),前端fetch在未配置超时的情况下,会持续等待服务器的响应信号,因此一直显示Pending。

解决方案

1. 前端手动设置请求超时

使用AbortController为fetch添加超时逻辑,主动终止长时间未响应的请求:

console.time('Req')
const controller = new AbortController();
// 设置5秒超时,可根据需求调整
const timeoutId = setTimeout(() => controller.abort(), 5000);

fetch('http://localhost:3000', { signal: controller.signal })
  .catch((e) => {
    console.timeEnd('Req')
    clearTimeout(timeoutId);
    console.log('请求终止:', e);
  });

2. 服务器端避免请求挂起

在Express中添加请求超时处理,防止请求无限挂起:

const app = require("express")();
const cors = require("cors");

app.use(cors());

// 全局请求超时中间件,5秒后自动返回超时响应
app.use((req, res, next) => {
  res.setTimeout(5000, () => {
    res.status(504).send('Gateway Timeout');
  });
  next();
});

app.get("/", (req, res) => {
  // 即使没有业务逻辑,也要主动结束请求
  // res.send('Hello World');
});

app.listen(3000, () => {
  console.log("App is up");
});

内容的提问来源于stack exchange,提问作者undefined

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:11:05