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

如何在Hasura Go GraphQL客户端查询结构体中声明分页变量$after

解决Hasura GraphQL Go客户端分页查询的$after变量解析错误

你的错误根源是初始查询时将after设为空字符串"",但GraphQL中$after是可空(nullable)的String类型,空字符串并非有效的起始cursor,且会导致客户端序列化出不符合规范的JSON值,触发解析错误。

修正方案

  1. 改用指针类型承载after变量:Go的原生string类型无法表示null,需用*string来对应GraphQL的nullable String类型,首次查询时传递nil表示从头开始。
  2. 循环分页逻辑优化:每次查询后更新after为当前页的endCursor指针,直到hasNextPage为false。

修正后的完整代码:

type Query struct {
    Entity struct {
        PageInfo struct {
            HasNextPage bool   `graphql:"hasNextPage"`
            EndCursor   string `graphql:"endCursor"`
        } `graphql:"pageInfo"`

        Nodes []struct {
            Name string `graphql:"name"`
        } `graphql:"nodes"`
    } `graphql:"entity(first: 10, after: $after)"`
}

func main() {
    // 初始after为nil,表示从头查询
    var after *string = nil
    var hasNextPage bool = true

    for hasNextPage {
        variables := map[string]interface{}{
            "after": after,
        }

        var q Query
        err := client.Query(context.Background(), &q, variables)
        if err != nil {
            // 替换为实际错误处理逻辑
            panic(err)
        }

        // 处理当前页数据
        for _, node := range q.Entity.Nodes {
            // 示例:打印名称,替换为你的业务逻辑
            println(node.Name)
        }

        // 更新分页状态
        hasNextPage = q.Entity.PageInfo.HasNextPage
        if hasNextPage {
            // 将endCursor转为指针赋值给after
            endCursor := q.Entity.PageInfo.EndCursor
            after = &endCursor
        } else {
            after = nil
        }
    }
}

关键说明

  • 用*string类型可以精准对应GraphQL中$after: String的可空语义:nil对应GraphQL的null,指针指向的字符串对应有效的cursor值。
  • 首次查询时传递nil,Hasura会返回第一页数据;后续查询传递上一页的endCursor指针,确保分页连续性。
  • 错误提示中的"EOF while parsing a value"是因为空字符串被客户端序列化为无效的JSON值,改用nil后会生成合法的null值,避免解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:26:24