Node.js调用Google智能家居API发送ReportState时遇socket hang up错误
解决Node.js对接Google智能家居API触发socket hang up问题的思路
问题描述
我使用Node.js客户端对接Google智能家居服务,当每分钟向Google智能家居API发送的请求数超过100~150次时,会出现以下错误:
FetchError: request to https://homegraph.googleapis.com/v1/devices:reportStateAndNotification failed, reason: socket hang up
根据官方文档,每个Actions项目默认限制为60秒内6000次请求,我的请求量远未达到这个数值,但仍触发了该问题。使用的依赖版本:
- @googleapis/homegraph: 3.0.2
- Node.js: 18.4.0
排查及解决思路
- 调整Node.js连接池配置
Node.js的HTTPS/HTTP模块默认有连接池socket数量限制(默认maxSockets为5),短时间大量请求会导致新请求等待可用socket超时,触发socket hang up。可以手动调整全局连接池参数:
const https = require('https'); // 提升HTTPS连接池最大socket数 https.globalAgent.maxSockets = 100;
也可以在@googleapis/homegraph客户端初始化时,自定义配置agent参数来单独控制该客户端的连接池。
优化请求批量处理
reportStateAndNotification接口支持批量上报多个设备的状态变更,无需为每个设备单独发起请求。将多个设备的状态合并到同一请求中,能大幅减少请求总数,降低连接压力。排查依赖库版本问题
@googleapis/homegraph3.0.2版本可能存在请求连接复用的bug,或者超时设置不合理。尝试升级到该库的最新稳定版本,或者改用axios/node-fetch等HTTP库手动实现请求,对比是否还会出现相同问题。验证隐性限流规则
除了文档标注的全局配额,Google可能对单个客户端IP、单用户设备设置了隐性的并发请求限制。可以尝试给请求添加小间隔(比如每10个请求增加100ms延迟),或者在多IP环境下分散请求发起源,观察问题是否缓解。排查网络链路问题
服务器到Google API的网络链路可能存在超时、丢包,或者防火墙/代理限制了并发连接数。可以用curl模拟并发请求测试网络稳定性,或者查看服务器的网络监控日志,确认是否有连接被异常中断的情况。
内容的提问来源于stack exchange,提问作者Tommy ASAI
相关产品推荐
相关产品推荐

