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

Express.js(Node.js)服务器闲置后无法发起外部API请求

可能的问题及解决方案

1. TCP长连接复用失效

外部API服务器通常会主动关闭闲置超过特定时长(比如45-60分钟)的TCP连接,但Node.js的HTTP客户端(包括axios、http模块)默认会复用长连接。如果客户端尝试复用已被服务器关闭的连接,就会出现请求挂起超时的情况。

解决方法:

  • 禁用HTTP长连接,强制每次请求创建新连接;
  • 配置客户端连接池的闲置超时时间,自动销毁过期连接。

示例(Axios配置):

const axios = require('axios');
const http = require('http');
const https = require('https');

// 禁用长连接,设置闲置socket30秒后销毁
const httpAgent = new http.Agent({
  keepAlive: false,
  freeSocketTimeout: 30000
});
const httpsAgent = new https.Agent({
  keepAlive: false,
  freeSocketTimeout: 30000
});

const apiClient = axios.create({
  httpAgent,
  httpsAgent,
  timeout: 10000 // 请求超时时间
});

2. DNS缓存过期或失效

Node.js默认会缓存DNS查询结果,若外部API的域名解析地址在闲置期间发生变更,客户端可能仍在使用旧的IP地址发起请求,导致超时。

解决方法:

  • 手动控制DNS解析,每次请求前重新获取目标域名的IP;
  • 缩短DNS缓存的TTL时间。

示例(手动解析DNS后发起请求):

const dns = require('dns').promises;
const http = require('http');

async function sendExternalRequest() {
  // 实时解析域名IP
  const [ip] = await dns.resolve4('your-external-api-domain.com');
  
  const options = {
    hostname: ip,
    port: 443, // 或80
    path: '/api/your-endpoint',
    method: 'POST',
    headers: {
      'Host': 'your-external-api-domain.com', // 必须指定Host头匹配域名
      'Content-Type': 'application/json'
    },
    timeout: 10000
  };

  return new Promise((resolve, reject) => {
    const req = http.request(options, (res) => {
      // 处理响应逻辑
      let data = '';
      res.on('data', chunk => data += chunk);
      res.on('end', () => resolve(JSON.parse(data)));
    });

    req.on('timeout', () => {
      req.destroy();
      reject(new Error('Request timed out'));
    });

    req.on('error', reject);
    req.write(JSON.stringify(yourRequestBody));
    req.end();
  });
}

3. PM2进程资源泄漏或状态异常

长时间闲置后,Node.js进程可能积累未释放的资源(如socket句柄、内存),或PM2的进程管理策略导致进程状态异常,进而影响请求处理。

解决方法:

  • 监控进程内存和连接数,排查资源泄漏:用process.memoryUsage()定期输出内存数据,用netstat -an | grep ESTABLISHED查看连接状态;
  • 配置PM2定期重启进程作为临时修复:在PM2配置文件中添加cron_restart: '0 */1 * * *'(每小时重启一次);
  • 检查PM2的cluster模式配置,确保进程负载均衡正常。

4. 事件循环阻塞

闲置期间若存在未清理的定时器、异步任务积累,可能导致Node.js事件循环阻塞,无法及时处理新的外部API请求。

解决方法:

  • 用node --inspect调试事件循环,查看闲置后的事件循环延迟;
  • 检查代码中是否有未清除的setInterval、未移除的事件监听器,及时清理无用的异步资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:22:35