GraphQL のオブジェクト型

May 03, 2023

概要

1 つ以上のスキーマで定義されているフィールドの集合をオブジェクト型といいます。JSON のように入れ子にすることが可能となります。例えば以下のような形でスキーマを定義します。

type Movie {
  id: ID!
  name: String!
  year: Int
  director: Director
}

type Director {
  id: ID!
  name: String!
  country: String!
}

動作の確認

実際にスキーマを定義して、動作を確認します。以下のように RandomDie を定義し、getDie という Query で返すようにします。

server.js
const express = require("express")
const { graphqlHTTP } = require("express-graphql");
const { buildSchema } = require("graphql");

// Defining GraphQL Schema
const schema = buildSchema(`
  type RandomDie {
    numSides: Int!
    rollOnce: Int!
    roll(numRolls: Int!): [Int]
  }

  type Query {
    getDie(numSides: Int): RandomDie
  }
`);

// Resolver function
class RandomDie {
  constructor(numSides) {
    this.numSides = numSides;
  }

  rollOnce() {
    return 1 + Math.floor(Math.random() * this.numSides);
  }

  roll({numRolls}) {
    let output = [];
    for (let i = 0; i < numRolls; i++) {
      output.push(this.rollOnce());
    }
    return output;
  }
}

const root = {
  getDie: ({numSides}) => {
    return new RandomDie(numSides || 6);
  }
};

// Launch Express server. Set graphiql: true to use GraphiQL
const app = express();
app.use("/graphql", graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true
}));
app.listen(4000);
console.log("Running a GraphQL API server at http://localhost:4000/graphql");

サーバーを起動します。

$ node server.js 
Running a GraphQL API server at http://localhost:4000/graphql

あとはブラウザからアクセスし、以下のようなクエリを実行してみましょう。

Query
query {
  getDie(numSides: 6) {
    rollOnce
    roll(numRolls:3)
  }
}

以下のようなレスポンスとなれば成功です。

Response
{
  "data": {
    "getDie": {
      "rollOnce": 4,
      "roll": [
        3,
        1,
        6
      ]
    }
  }
}

f:id:shiro_kochi:2018××××××××:plain:w100:left


 © 2023, Dealing with Ambiguity