使用Apollo Client与graphql-go时GraphQL查询报‘Unknown type Int’错误
解决graphql-go中传递Int标量参数报错"Unknown type 'Int'"的问题
这问题我之前帮朋友排查过,大概率是你在graphql-go服务端定义Schema的时候,没正确使用内置的Int标量类型,或者没把它正确注册到Schema中。咱们一步步来定位解决:
1. 检查查询字段的参数类型定义
你在定义client查询字段时,参数id的类型必须使用graphql-go内置的graphql.Int,而不是手写字符串"Int"或者其他自定义类型。举个正确的示例:
// 先定义你的Client对象类型 clientType := graphql.NewObject(graphql.ObjectConfig{ Name: "Client", Fields: graphql.Fields{ "id": &graphql.Field{Type: graphql.Int}, "name": &graphql.Field{Type: graphql.String}, }, }) // 定义client查询字段 clientField := &graphql.Field{ Type: clientType, Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{ Type: graphql.Int, // 这里必须用graphql-go内置的Int类型,不能写错! }, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { // 解析参数时注意类型断言 id, ok := p.Args["id"].(int) if !ok { return nil, fmt.Errorf("无效的ID类型") } // 这里替换成你的业务逻辑,比如从数据库查询Client return getClientByID(id), nil }, }
2. 确认导入了正确的graphql-go包
确保你的代码里导入了官方的graphql-go包,这样才能访问到它的内置标量类型(Int、String、Boolean等):
import "github.com/graphql-go/graphql"
如果用的是第三方分支或自定义包,可能内置标量的定义会有差异,优先用官方包来避免这类问题。
3. 检查根查询与Schema的组装
要确保你的根查询类型正确包含了client字段,并且Schema初始化时正确关联了根查询:
// 定义根查询 rootQuery := graphql.NewObject(graphql.ObjectConfig{ Name: "RootQuery", Fields: graphql.Fields{ "client": clientField, // 把上面定义的client字段加进来 }, }) // 初始化Schema schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: rootQuery, // 如果有Mutation操作,也在这里添加 }) if err != nil { log.Fatalf("Schema初始化失败: %v", err) }
额外排查:自定义标量的特殊情况
如果你因为特殊需求自定义了Int标量,那必须把这个自定义标量注册到Schema中,否则服务端会识别不了。比如:
// 自定义Int标量示例(一般没必要,除非特殊需求) customInt := graphql.NewScalar(graphql.ScalarConfig{ Name: "Int", // 实现序列化、反序列化逻辑... }) // 初始化Schema时要把自定义标量加入Types列表 schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: rootQuery, Types: []graphql.Type{customInt}, })
总结
你客户端的查询代码是没问题的($id: Int符合GraphQL规范),报错核心原因是服务端没有正确识别Int类型。按照上面的步骤检查一遍,尤其是字段参数类型是否用了graphql.Int,应该就能解决这个问题。
内容的提问来源于stack exchange,提问作者slowcode
相关产品推荐
相关产品推荐

