多くのアプリケーションでは、アプリケーションの起動時に固定スキーマを定義し、GraphQLスキーマ言語を使用して定義できます。場合によっては、スキーマをプログラムで構築すると便利です。 GraphQLSchema
コンストラクタを使用してこれを行うことができます。
スキーマの作成に`GraphQLSchema`コンストラクタを使用する場合、スキーマ言語のみを使用して`Query`および`Mutation`タイプを定義する代わりに、それらを別々のオブジェクトタイプとして作成します。
たとえば、IDに基づいて少数のハードコードされたユーザーのユーザーデータを取得できるシンプルなAPIを構築しているとします。`buildSchema`を使用すると、次のようなサーバーを作成できます。
var express = require("express")var { createHandler } = require("graphql-http/lib/use/express")var { buildSchema } = require("graphql")
var schema = buildSchema(` type User { id: String name: String }
type Query { user(id: String): User }`)
// Maps id to User objectvar fakeDatabase = { a: { id: "a", name: "alice", }, b: { id: "b", name: "bob", },}
var root = { user: ({ id }) => { return fakeDatabase[id] },}
var app = express()app.all( "/graphql", createHandler({ schema: schema, rootValue: root, }))app.listen(4000)console.log("Running a GraphQL API server at localhost:4000/graphql")
GraphQLスキーマ言語を使用せずに、同じAPIを実装できます。
var express = require("express")var { createHandler } = require("graphql-http/lib/use/express")var graphql = require("graphql")
// Maps id to User objectvar fakeDatabase = { a: { id: "a", name: "alice", }, b: { id: "b", name: "bob", },}
// Define the User typevar userType = new graphql.GraphQLObjectType({ name: "User", fields: { id: { type: graphql.GraphQLString }, name: { type: graphql.GraphQLString }, },})
// Define the Query typevar queryType = new graphql.GraphQLObjectType({ name: "Query", fields: { user: { type: userType, // `args` describes the arguments that the `user` query accepts args: { id: { type: graphql.GraphQLString }, }, resolve: (_, { id }) => { return fakeDatabase[id] }, }, },})
var schema = new graphql.GraphQLSchema({ query: queryType })
var app = express()app.all( "/graphql", createHandler({ schema: schema, }))app.listen(4000)console.log("Running a GraphQL API server at localhost:4000/graphql")
この方法でAPIを作成する場合、ルートレベルのレゾルバーは、`root`オブジェクトではなく、`Query`および`Mutation`タイプに実装されます。
これは、データベーススキーマなど、他のものからGraphQLスキーマを自動的に作成する場合に特に便利です。データベースレコードの作成や更新など、共通の形式を使用している場合があります。これは、ES6クラスとスキーマ言語に明確に対応付けられないユニオンタイプなどの機能を実装する場合にも役立ちます。