Golang gqlgen 尝试将模型导入 resolver.go 时出错
Golang gqlgen error trying to import model into resolver.go
你好,我正在玩 Golang,想尝试 GraphQL 而不是 RESTful 方法。
所以我决定用https://github.com/99designs/gqlgen来实现。
我按照入门指南操作,一切顺利,直到我粘贴了 resolver.go 代码。
我的文件夹结构:
├── go.mod
├── go.sum
├── gqlgen.yml
├── graph
│ ├── generated
│ │ └── generated.go
│ ├── model
│ │ └── models_gen.go
│ ├── resolver.go
│ ├── schema.graphqls
│ └── schema.resolvers.go
└── server.go
我的resolver.go
package graph
import (
"context"
"fmt"
"math/rand"
)
type Resolver struct {
todos []*model.Todo
}
func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
todo := &model.Todo{
Text: input.Text,
ID: fmt.Sprintf("T%d", rand.Int()),
User: &model.User{ID: input.UserID, Name: "user " + input.UserID},
}
r.todos = append(r.todos, todo)
return todo, nil
}
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
return r.todos, nil
}
显然它会抛出一个错误,因为我没有导入模型。
所以我试着像那样导入它"[MODULENAME]/graph/model"
这导致:
graph/schema.resolvers.go:14:28: (*mutationResolver).CreateTodo redeclared in this block
previous declaration at graph/resolver.go:18:6
graph/schema.resolvers.go:18:25: (*queryResolver).Todos redeclared in this block
previous declaration at graph/resolver.go:28:6
如果我尝试 [MODULENAME]/model
它抛出这个错误:
cannot find module providing package [MODULENAME]/model: unrecognized import path "[MODULENAME]/model": https fetch: Get "[MODULENAME]/model?go-get=1": dial tcp [MYSERVER IP]: connect: connection refused
我是 Golang 和模块的新手。我试图解决但不知何故我非常困惑。
如果有任何帮助,我将不胜感激。
亲切的问候
您的问题是您多次声明了 (*mutationResolver).CreateTodo
和 (*queryResolver).Todos
函数。首先,您在 graph/resolver.go
文件中定义了它们,第二次在 gqlgen 生成的 graph/schema.resolvers.go
文件中定义了它们。
graph/schema.resolvers.go
文件每次都会重新生成,并将包含无法与您的 "state" 匹配的所有解析器实现,这是您的 Resolver
结构,或者来自 model
文件夹。
解决方案:
- 您可以轻松地从
graph/schema.resolvers.go
文件中删除这些声明
- 或者再次 运行
gqlgen generate
命令,因为它会找到您的实现并从新生成的文件中删除这些行
关于模块和导入路径的注释:
您的第一个导入路径很棒,如果您的 go.mod
文件位于根目录中,您可以使用 yourmodulename/path/to/folder
格式导入其中的所有包。在这种情况下,yourmodulename/graph/model
是您的导入路径。
你好,我正在玩 Golang,想尝试 GraphQL 而不是 RESTful 方法。 所以我决定用https://github.com/99designs/gqlgen来实现。
我按照入门指南操作,一切顺利,直到我粘贴了 resolver.go 代码。
我的文件夹结构:
├── go.mod
├── go.sum
├── gqlgen.yml
├── graph
│ ├── generated
│ │ └── generated.go
│ ├── model
│ │ └── models_gen.go
│ ├── resolver.go
│ ├── schema.graphqls
│ └── schema.resolvers.go
└── server.go
我的resolver.go
package graph
import (
"context"
"fmt"
"math/rand"
)
type Resolver struct {
todos []*model.Todo
}
func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
todo := &model.Todo{
Text: input.Text,
ID: fmt.Sprintf("T%d", rand.Int()),
User: &model.User{ID: input.UserID, Name: "user " + input.UserID},
}
r.todos = append(r.todos, todo)
return todo, nil
}
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
return r.todos, nil
}
显然它会抛出一个错误,因为我没有导入模型。
所以我试着像那样导入它"[MODULENAME]/graph/model"
这导致:
graph/schema.resolvers.go:14:28: (*mutationResolver).CreateTodo redeclared in this block
previous declaration at graph/resolver.go:18:6
graph/schema.resolvers.go:18:25: (*queryResolver).Todos redeclared in this block
previous declaration at graph/resolver.go:28:6
如果我尝试 [MODULENAME]/model
它抛出这个错误:
cannot find module providing package [MODULENAME]/model: unrecognized import path "[MODULENAME]/model": https fetch: Get "[MODULENAME]/model?go-get=1": dial tcp [MYSERVER IP]: connect: connection refused
我是 Golang 和模块的新手。我试图解决但不知何故我非常困惑。 如果有任何帮助,我将不胜感激。
亲切的问候
您的问题是您多次声明了 (*mutationResolver).CreateTodo
和 (*queryResolver).Todos
函数。首先,您在 graph/resolver.go
文件中定义了它们,第二次在 gqlgen 生成的 graph/schema.resolvers.go
文件中定义了它们。
graph/schema.resolvers.go
文件每次都会重新生成,并将包含无法与您的 "state" 匹配的所有解析器实现,这是您的 Resolver
结构,或者来自 model
文件夹。
解决方案:
- 您可以轻松地从
graph/schema.resolvers.go
文件中删除这些声明 - 或者再次 运行
gqlgen generate
命令,因为它会找到您的实现并从新生成的文件中删除这些行
关于模块和导入路径的注释:
您的第一个导入路径很棒,如果您的 go.mod
文件位于根目录中,您可以使用 yourmodulename/path/to/folder
格式导入其中的所有包。在这种情况下,yourmodulename/graph/model
是您的导入路径。