LoginSignup
0
1

More than 5 years have passed since last update.

GraphQLの旅(5) Prismaで作ったCRUDを(一部変形し)GraphQLサーバで公開する

Last updated at Posted at 2018-07-15

GraphQLサーバからのAPIインポートは明示的に宣言が必要

PrismaではOpenCRUDという基本的なAPIを勝手に作ってくれますが、GraphQLサーバ(apolloとかgraphgl-yogaとか)でそれを公開するには、インポート用の宣言しなければいけません。

まず、データ型は次のUserとします。

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

宣言する場所は、graphql-yogaではschema.graphqlです。
下記のように記載します。

# import User from './generated/prisma.graphql'

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

type Mutation {
  createUser(name: String!): User
}

次に、graphqlサーバのアプリケーション内index.jsに上記宣言済みAPIのresolverを書きます。
これでPrismaで生成したOpenCRUDが、APIとつながります。

const { Prisma } = require('prisma-binding')
const resolvers = {
  Query: {
    user: (_, args, context, info) => {
      return context.prisma.query.user({ where: { id: args.id,}},info)
    },
    users:  (_, args, context, info) => {
      return context.prisma.query.users({}, info);
    },
  },
  Mutation: {
    createUser: (_, args, context, info) => {
      return context.prisma.mutation.createUser({data: {name: args.name}}, info)
    },
  },  
}

上記resolverは、以下のようなAPIのつながりがあるということを意味します。

API種別 公開するAPI 元のPrismaのAPI
Query user(id: ID) (少し元と違う) context.prisma.query.user(where: {id: ID})
Query users context.prisma.query.users
Mutation createUser(name: String) (少し元と違う) context.prisma.query.createUser(data: {name: String})

一部変形してAPI公開

最後のcreateUserは少し元のAPIと違って、引数がdata: {name: String}からname: Stringになっており、dataオブジェクトを引数とするAPIから、より簡単なnameだけを引数とするAPIを作っていることがわかります。

  • 変形したところ(args.namedataオブジェクトに入れられている)
    createUser: (_, args, context, info) => {
      return context.prisma.mutation.createUser({data: {name: args.name}}, info)
    },

参考

OpenCRUD
Prismaチュートリアル
Hello World GraphQLサーバ

0
1
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
0
1