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 是您的导入路径。