如何在Hasura Go GraphQL客户端查询结构体中声明分页变量$after
解决Hasura GraphQL Go客户端分页查询的$after变量解析错误
你的错误根源是初始查询时将after设为空字符串"",但GraphQL中$after是可空(nullable)的String类型,空字符串并非有效的起始cursor,且会导致客户端序列化出不符合规范的JSON值,触发解析错误。
修正方案
- 改用指针类型承载
after变量:Go的原生string类型无法表示null,需用*string来对应GraphQL的nullable String类型,首次查询时传递nil表示从头开始。 - 循环分页逻辑优化:每次查询后更新
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
相关产品推荐
相关产品推荐

