浏览器是否默认设置未响应请求超时关闭?实测请求长期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
相关产品推荐
相关产品推荐

