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

Substrate Offchain Worker调用GitHub API时pending.try_wait函数报错求解

错误根源

  • 超时阈值设置过低:你设置的2000毫秒超时对于GitHub API请求来说太短,GitHub API跨区域请求的平均响应延迟普遍在2秒以上,很容易触发DeadlineReached错误。
  • TLS证书验证失败:Substrate Offchain Worker默认内置的CA根证书列表可能没有覆盖GitHub API使用的最新根证书,导致SSL握手阶段失败,触发IO错误,最终在try_wait阶段抛出异常。
  • GitHub API限流:未携带认证信息的GitHub公共API请求每小时仅允许60次访问,触发限流时GitHub会拉长响应时间或者直接拦截请求,也会导致try_wait报错。
  • 错误映射太笼统:你当前的代码把所有请求阶段的错误都统一映射为通用枚举值,无法区分具体错误类型,看起来是try_wait阶段报错,实际问题可能出在更早的握手、请求发送阶段。

解决方案

  1. 拉长超时时间,先排除超时问题,建议将超时时间调整到10000毫秒:
    把代码中Duration::from_millis(2_000)替换为Duration::from_millis(10_000)即可。
  2. 补充错误日志打印,先定位具体错误原因:
    修改错误映射逻辑,把底层错误内容打印到日志中,就能明确是超时、SSL错误还是限流导致的问题。
  3. 添加GitHub API认证头:
    生成GitHub个人访问令牌,在请求头中添加Authorization字段,携带令牌后请求额度会提升到每小时5000次,同时响应速度也会明显提升,降低限流触发概率。
  4. 测试环境可临时开启SSL证书跳过验证(生产环境不推荐):
    如果是本地测试场景,可以在节点启动时配置Offchain Worker允许跳过无效证书验证,排除证书问题。

修改后的参考代码

let deadline = sp_io::offchain::timestamp().add(Duration::from_millis(10_000));
let request =
    http::Request::get("https://api.github.com/orgs/substrate-developer-hub");
let pending = request
    .add_header("User-Agent", "SampleAgent")
    // 可选:添加GitHub认证头,替换为自己的个人访问令牌
    // .add_header("Authorization", "token ghp_xxxxxxxxxxxxxx")
    .deadline(deadline).send()
    .map_err(|e| {
        log::error!("请求发送失败,错误信息:{:?}", e);
        http::Error::IoError
    })?;
let response = pending.try_wait(deadline).map_err(|e| {
    log::error!("等待响应失败,错误信息:{:?}", e);
    http::Error::DeadlineReached
})??;
if response.code != 200 {
    log::warn!("非预期状态码:{}", response.code);
    // 打印响应体内容,排查GitHub返回的具体报错
    let body = response.body().collect::<Vec<u8>>();
    log::warn!("响应内容:{}", String::from_utf8_lossy(&body));
    return Err(http::Error::Unknown)
}

内容的提问来源于stack exchange,提问作者s.Takahashi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:57:00