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
相关产品推荐
相关产品推荐

