gqlgen
gqlgen是什么?
gqlgen是一个用于轻松构建GraphQL服务器的Go库。
- gqlgen基于Schema优先的方法 — 你可以使用GraphQL Schema定义语言来定义你的API。
- gqlgen优先考虑类型安全 — 你不会在这里看到
map[string]interface{}
。 - gqlgen支持代码生成 — 我们生成枯燥的部分,让你能够专注于快速构建应用。
还不确定是否要使用gqlgen?将gqlgen与其他Go graphql实现进行比较
快速开始
-
mkdir example cd example go mod init example
-
将
github.com/99designs/gqlgen
添加到你的项目的tools.go中printf '//go:build tools\npackage tools\nimport (_ "github.com/99designs/gqlgen"\n _ "github.com/99designs/gqlgen/graphql/introspection")' | gofmt > tools.go go mod tidy
-
初始化gqlgen配置并生成模型
go run github.com/99designs/gqlgen init go mod tidy
-
启动graphql服务器
go run server.go
更多入门帮助:
报告问题
如果你认为发现了bug,或者某些东西的行为不符合你的预期,请在GitHub上提出issue。
贡献
我们欢迎贡献,阅读我们的贡献指南以了解更多关于为gqlgen贡献的信息
常见问题
如何防止获取可能不会使用的子对象?
当你有像这样的嵌套或递归schema时:
type User {
id: ID!
name: String!
friends: [User!]!
}
你需要告诉gqlgen只在用户请求时才获取朋友。有两种方法可以做到这一点:
-
使用自定义模型
编写一个省略friends字段的自定义模型:
type User struct {
ID int
Name string
}
并在gqlgen.yml
中引用该模型:
# gqlgen.yml
models:
User:
model: github.com/you/pkg/model.User # 指向上面User结构体的go导入路径
-
使用显式解析器
如果你想继续使用生成的模型,在gqlgen.yml
中明确标记该字段需要解析器,如下所示:
# gqlgen.yml
models:
User:
fields:
friends:
resolver: true # 强制生成解析器
在执行上述任一操作并运行生成后,我们需要为friends提供一个解析器:
func (r *userResolver) Friends(ctx context.Context, obj *User) ([]*User, error) {
// select * from user where friendid = obj.ID
return friends, nil
}
你也可以使用内联配置和指令来实现相同的结果
directive @goModel(model: String, models: [String!]) on OBJECT
| INPUT_OBJECT
| SCALAR
| ENUM
| INTERFACE
| UNION
directive @goField(forceResolver: Boolean, name: String, omittable: Boolean) on INPUT_FIELD_DEFINITION
| FIELD_DEFINITION
type User @goModel(model: "github.com/you/pkg/model.User") {
id: ID! @goField(name: "todoId")
friends: [User!]! @goField(forceResolver: true)
}
我可以将ID的类型从String更改为Int吗?
可以!你可以通过在配置中重新映射来实现,如下所示:
models:
ID: # GraphQL类型ID由以下类型支持
model:
- github.com/99designs/gqlgen/graphql.IntID # go整数
- github.com/99designs/gqlgen/graphql.ID # 或go字符串
- github.com/99designs/gqlgen/graphql.UintID # 或go无符号整数
这意味着gqlgen将能够自动绑定到你自己编写的模型的字符串或整数,但这个列表中的第一个模型被用作默认类型,并且在以下情况下始终使用:
- 基于schema生成模型
- 作为解析器中的参数
这是无法避免的,gqlgen无法知道你在给定上下文中想要什么。
为什么我的接口有getter?我可以禁用这些吗?
这些是在v0.17.14中添加的,以允许在不转换为具体类型的情况下访问常见的接口字段。 然而,某些字段,如Relay风格的连接,无法用简单的getter实现。
如果你更喜欢不在接口中生成getter,可以在你的gqlgen.yml
中添加以下内容:
# gqlgen.yml
omit_getters: true