11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GraphQLの旅(2) Prismaで開発したGraphQL APIを公開

Last updated at Posted at 2018-07-03

Prismaからスキーマをgraphql-yogaにもっていく

前回、PrismaでのAPI開発を取り上げました。
必要なデータベースとスキーマ定義はそろったことになります。

今回はそれを本当にAPIとして公開するためのサーバ構築です。
Backend for Frontend (BFF)とも呼ばれるサーバです。

graphql2.png

Prisma本家ドキュメントでも紹介されているgraphql-yogaを使用します。

前提:Prisma+DB構築ずみ

前回作ったgraphql-psql-k8sフォルダにすでにPrismaで開発したAPIの各種ファイルがあるとします。
そして、Prismaサーバがhttp://192.168.99.100:30432/で起動しているとします。

graphql-psql-k8s/
├── datamodel.graphql
├── docker-compose.yml
├── k8s
│   ├── postgres-deployment.yaml
│   ├── postgres-persistentvolumeclaim.yaml
│   ├── postgres-service.yaml
│   ├── prisma-deployment.yaml
│   └── prisma-service.yaml
└── prisma.yml

(k8sフォルダはオプションです)

スキーマは、下記の通り単純なものです。

datamodel.graphql
type User {
  id: ID! @unique
  name: String!
}

graphql-yogaのフォルダを作る

graphql-psql-k8sフォルダと同じ階層(隣)に別のgraphql-yogaフォルダを作ります。

graphql-psql-k8s
graphql-yoga/
├── .graphqlconfig.yaml
└── src
    ├── index.js
    └── schema.graphql

各ファイルには下記をコピーします。

.graphqlconfig.yaml
projects:
  app:
    schemPath: src/schema.graphql
    extensions:
      endpoints:
        default: http://localhost:4010
  prisma:
    schemaPath: src/generated/prisma.graphql
    extensions:
      prisma: ../graphql-psql-k8s/prisma.yml
src/index.js
const { GraphQLServer } = require('graphql-yoga')
const { Prisma } = require('prisma-binding')

const resolvers = {
  Query: {
    user: (_, args, context, info) => {
      return context.prisma.query.user(
        {
          where: {
            id: args.id,
          },
        },
        info,
      )
    },
  },
}

const server = new GraphQLServer({
  typeDefs: 'src/schema.graphql',
  resolvers,
  context: req => ({
    ...req,
    prisma: new Prisma({
      typeDefs: 'src/generated/prisma.graphql',
      endpoint: 'http://192.168.99.100:30432',
    }),
  }),
})
server.start({ port: 4010,}, ({port}) => console.log(`GraphQL server is running on http://localhost:${port}`))
src/schema.graphql
# import User from './generated/prisma.graphql'

type Query {
  user(id: ID!): User
}

注意: schema.graphqlの最初の行をコメントだと思って外さないこと。 れっきとしたimport文です。(ここではまった)

ライブラリのダウンロード、そしてサーバ起動

もしgraphqlコマンドがインストールされていない場合はインストールします。

yarn global add graphql-cli

ライブラリをインストールします。

yarn add graphql-yoga prisma-binding

prismaからスキーマを抜いてきます。

graphql get-schema -p prisma

これで、下記のようなフォルダになります。

.
├── .graphqlconfig.yaml
├── package.json
├── node_modules
├── src
│   ├── generated
│   │   └── prisma.graphql
│   ├── index.js
│   └── schema.graphql
└── yarn.lock

さて起動です。

node src/index.js

起動後、アクセス

http://localhost:4010
で起動しているgraphql-yogaにアクセスします。

image.png

補足

ソースコードをGithubに置きました。

onelittlenightmusic/graphql-psql-k8s

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?