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

如何阻止Axios相关请求2分钟后重试?Node.js+React场景解决

解决Firefox在长时请求后自动重试的问题

你遇到的核心问题是Firefox默认的HTTP请求超时为120秒(2分钟),当Teradata查询耗时超过这个时间时,浏览器会判定连接失效并发起重试——而Chrome的默认超时更长,所以不会出现这个问题。之前你尝试的socket.setTimeout针对的是TCP连接的空闲超时,而非HTTP请求的整体超时,因此没起作用。下面是需要从客户端、服务器端和数据库连接三个层面入手的具体解决方案:

1. 客户端Axios设置超时时间

给Axios请求显式配置一个足够长的超时时间(建议比5分钟多留缓冲,比如6分钟),覆盖浏览器的默认限制:

axios.get(apiServer + 'teradata/' + table, {
  timeout: 360 * 1000 // 设置为6分钟,360秒
}).then((resp) => {
  console.log(resp.data.data)
}).catch(err => {
  // 别忘了处理超时或其他错误
  console.error('请求失败:', err)
})

注意:Axios默认timeout为0表示不主动设置超时,但浏览器仍会使用自身的默认超时规则,因此必须显式配置足够大的值。

2. 服务器端Express配置请求/响应超时

之前的socket.setTimeout针对的是TCP连接的空闲状态,而你的请求一直在处理Teradata查询,连接并非空闲,所以这个设置无效。你需要直接设置HTTP请求和响应的超时:

const express = require('express');
const app = express();
const server = app.listen(3000);

// 设置全局服务器超时为6分钟
server.timeout = 360 * 1000;

// 或者针对单个Teradata路由单独设置(更精准)
app.get('/teradata/:table', (req, res) => {
  // 延长当前请求的超时时间
  req.setTimeout(360 * 1000);
  res.setTimeout(360 * 1000);

  // 这里执行你的Teradata查询逻辑
  runTeradataQuery(req.params.table)
    .then(result => res.json({ data: result }))
    .catch(err => res.status(500).json({ error: err.message }));
});

3. 保持连接活跃(关键步骤)

即使设置了超时,如果长时间没有数据返回,Firefox仍可能认为连接已中断。这时可以用分块传输编码,每隔一段时间给客户端发送一个空的响应块,让浏览器知道连接还在活跃:

app.get('/teradata/:table', (req, res) => {
  req.setTimeout(360 * 1000);
  res.setTimeout(360 * 1000);
  // 启用分块传输
  res.setHeader('Transfer-Encoding', 'chunked');

  // 每隔30秒发送一个空格,保持连接活跃
  const keepAliveInterval = setInterval(() => {
    res.write(' '); // 该空格不会影响最终的JSON响应
  }, 30 * 1000);

  runTeradataQuery(req.params.table)
    .then(result => {
      clearInterval(keepAliveInterval);
      res.json({ data: result }); // 最终发送完整响应
    })
    .catch(err => {
      clearInterval(keepAliveInterval);
      res.status(500).json({ error: err.message });
    });
});

4. 确保Teradata驱动的超时设置

最后,别漏掉Teradata客户端驱动的超时配置,防止数据库查询先于HTTP请求超时:

// 以teradata-nodejs-driver为例
const teradata = require('teradata-nodejs-driver');
const connection = teradata.createConnection({
  host: '你的Teradata主机地址',
  username: '用户名',
  password: '密码',
  queryTimeout: 360 * 1000 // 设置查询超时为6分钟
});

把这几个步骤都配置好后,Firefox就不会在2分钟后重试了,请求会正常等待Teradata查询完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:22:00