# HOW TO GRAPHQLでGraphQLの勉強をはじめました その⑤

# A Simple Mutation

前回はGraphQLのQueryを実装しましたが、今回はMutation。Hackernewsクローンを作っているわけですが、新しいリンクをサーバーにポストしてみましょう、といった内容。

# Extending the schema definition

前回と同様にまずはGraphQLのスキーマ定義から。クエリについて書かれているindex.jsにMutationを追加していきます。

const typeDefs = `
type Query {
  info: String!
  feed: [Link!]!
}

type Mutation {
  post(url: String!, description: String!): Link!
}

type Link {
  id: ID!
  description: String!
  url: String!
}

ちょっとスキーマ定義ファイルが大きくなってきたので、ここで少しリファクタリングしていきましょう。srcディレクトリの中にschema.graphqlというファイルを作ってそこに定義を記述します。

type Query {
  info: String!
  feed: [Link!]!
}

type Mutation {
  post(url: String!, description: String!): Link!
}

type Link {
  id: ID!
  description: String!
  url: String!
}

そして、index.jsは👇のようにこざっぱり。

const server = new GraphQLServer({
  typeDefs: './src/schema.graphql',
  resolvers,
})

# Implementing the resolver function

続いて新しいフィールドに対してリゾルバファンクションに実装を加えていきます。index.jsにMutationを追加。

// リンクに付与するユニークなID
let idCount = links.length
const resolvers = {
  Query: {
    info: () => `This is the API of a Hackernews Clone`,
    feed: () => links,
  },
  // リンクオブジェクトを作ってlinksに追加
  Mutation: {
    post: (parent, args) => {
      const link = {
        id: `link-${idCount++}`,
        description: args.description,
        url: args.url,
      }
      links.push(link)
      return link
    }
  },
}

idCountというリンクに付与するユニークなID(link-の後にカウントアップされた数字)を付けてlinksに追加するというのがMutationの処理の一連の流れ。

ところでargsとは?っていう話で今回のケースはurlやdescriptionを運んでくるもの。feedやinfoではrootオブジェクトのフィールドだけで具体的なaugmentsはスキーマ定義に含めていなかったので必要なかったんだけどね、と。

# Testing the mutation

ということで、サーバーを最高してPlaygroundに👇を突っ込んでみましょう。

mutation {
  post(
    url: "www.prisma.io"
    description: "Prisma replaces traditional ORMs"
  ) {
    id
  }
}

すると結果として👇が返ってきます。

{
  "data": {
    "post": {
      "id": "link-1"
    }
  }
}

mutationのリクエストを送るたびに、link-2、link-3とカウントアップされていきます。ここで、mutationがちゃんと動いたか確認するために、feedクエリを実行してみましょう👇

feed

ここでサーバーを追加すると全てin-memoryで扱っているため上記でmutationしたデータは消えてしまいます。次のセクションではデータベースレイヤに関する処理をGraphQLサーバーに追加して永続化していきます。

# Exercise

リゾルバをもっとホゲホゲしていきたい人は👇のスキーマ定義を元に実装してみましょう。

type Query {
  # Fetch a single link by its `id`
  link(id: ID!): Link
}

type Mutation {
  # Update a link
  updateLink(id: ID!, url: String, description: String): Link

  # Delete a link
  deleteLink(id: ID!): Link
}

んー、ちょっと今日は眠いので明日やってみます 😃

このエントリーをはてなブックマークに追加

Algolia検索からの流入のみConversionボタン表示