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

Node.js全天候调用Facebook Graph API,三四天后出现connect ENETUNREACH错误

解决Node.js调用Facebook Graph API隔3-4天出现ENETUNREACH错误的问题

嘿,这个问题我之前维护长期运行的爬虫服务时也碰到过!connect ENETUNREACH本质是你的Node.js进程没法和Facebook的服务器建立网络连接了,隔几天就炸,大概率是下面这几个原因,给你几个排查和解决的实用思路:

1. 优化HTTP客户端的连接复用配置

Node.js默认的HTTPS Agent会复用TCP连接,但如果长时间闲置的连接被Facebook服务器主动关闭,而客户端没处理失效连接,后续请求就会用死连接导致报错。你可以自定义Agent来优化连接管理:

const https = require('https');

// 配置一个更健壮的Agent
const customAgent = new https.Agent({
  keepAlive: true, // 开启连接复用
  maxSockets: 20, // 限制同时连接数,避免过载
  timeout: 30000, // 连接超时30秒
  keepAliveMsecs: 10000, // 10秒内无请求就关闭闲置连接
  rejectUnauthorized: true // 保持SSL验证,安全起见
});

// 后续所有Graph API请求都用这个Agent
const fetchVideo = async () => {
  const res = await https.get('https://graph.facebook.com/v18.0/your-video-endpoint', { agent: customAgent });
  // 处理响应逻辑...
};

2. 排查DNS缓存或IPv6连接问题

有时候Node.js的DNS缓存会过期,或者服务器的IPv6网络不稳定,导致解析到不可用的IP。可以试试:

  • 强制优先使用IPv4:在进程启动时设置dns.setDefaultResultOrder('ipv4first')
  • 手动刷新DNS:定期调用dns.resolve('graph.facebook.com')获取最新IP,或者在请求失败时重新解析

3. 监控进程资源是否耗尽

长期运行的Node.js进程如果有内存泄漏、文件句柄耗尽的情况,会导致系统资源不足,进而引发网络请求失败。你可以:

  • 定期打印内存使用情况:console.log(process.memoryUsage())
  • 用clinic.js工具排查内存泄漏(本地测试时用)
  • 确保所有响应流、文件流都被正确关闭,避免资源占用

4. 增加错误重试与进程容错机制

网络波动是常态,未捕获的错误会直接杀死进程。你需要:

  • 给每个请求加重试逻辑(比如自己写简单的重试循环,或者用成熟的重试库)
  • 捕获全局未处理的错误,防止进程崩溃:
process.on('uncaughtException', (err) => {
  console.error('未捕获异常:', err);
  // 这里可以触发重启请求任务的逻辑,比如重新初始化拉取流程
});

process.on('unhandledRejection', (reason) => {
  console.error('未处理的Promise拒绝:', reason);
});

5. 临时缓解:定期重启进程

如果暂时找不到根本原因,可以用PM2来管理你的Node.js进程,设置自动重启或者定时重启:

# 安装PM2
npm install -g pm2
# 启动进程并设置每天凌晨2点重启
pm2 start your-script.js --cron-restart "0 2 * * *"

这样即使隔几天出问题,进程也会自动恢复,不影响全天候运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:30:08