うさぎ小屋(仮)

📅  2021-11-11

gqlgenで最速でgraphQLサーバをたてる


https://gqlgen.com/getting-started/

こちらに沿って、gqlgenでgraphQLサーバを立ててみます。

前提条件

  • go 1.17.2
  • gqlgen 0.14.0

スケルトン生成まで

# リポジトリの作成
gh repo create amasok/sample-graphql
# ghqでgetしてくる
ghq get amasok/sample-graphql
# ディレクトリに移動
cd /Users/amasok/ghq/github.com/amasok/sample-graphql
# go modの初期化
go mod init github.com/amasok/sample-grahql
# gqlgenのインストール(1.17系だとこのコマンドじゃないと入らない)
go install github.com/99designs/gqlgen
# gqlgenのコマンドでスケルトン生成(GOPATHが通ってればこれでいけるはず)
gqlgen init
# スケルトンのライブラリなどインストール
go mod tidy

↑これだけ。

この時点で以下のようなファイルが生成されます。

.
├── go.mod
├── go.sum
├── gqlgen.yml
├── graph
│   ├── generated
│   │   └── generated.go
│   ├── model
│   │   └── models_gen.go
│   ├── resolver.go
│   ├── schema.graphqls
│   └── schema.resolvers.go
└── server.go

起動とクエリの実行

$ go run ./server.go
2021/11/17 21:03:31 connect to http://localhost:8080/ for GraphQL playground

http://localhost:8080/

↑playgroudが立ち上がるので、ここからクエリを飛ばせる。

image in the content

このままではクエリを投げても正しい値は返ってこないので下記ファイルのCreateTodoとTodosのメソッドを修正して固定値を返すようにします。

graph/schema.resolvers.go

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()), // import "math/rand"
		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
}

graph/resolver.go

type Resolver struct {
	todos []*model.Todo
}

修正したら再度 go run ./server.go

image in the content
mutation createTodo {
  createTodo(input: { text: "todo", userId: "1" }) {
    user {
      id
    }
    text
    done
  }
}
image in the content
query findTodos {
  todos {
    text
    done
    user {
      name
    }
  }
}

なんと作成したデータを返してくれるようになります。

メモリ上にもっているだけなのでgraphQLサーバを再起動させればデータは消えますが、 作成や値が返ってくるところまでできました。

このあと、ディレクトリ構成やログ出力、認証認可や不揮発なデータ保存など本格的な実装に進みますが、今日はここまで。