GraphQLを使用している開発者の皆さん、「Schema is not configured for subscriptions」というエラーに遭遇したことはありませんか?このエラーは、GraphQLスキーマがサブスクリプションに対応していない場合に発生します。本記事では、このエラーの原因と解決方法について詳しく解説します。

エラーの原因

「Schema is not configured for subscriptions」エラーが発生する主な理由は以下の通りです:

1. スキーマ定義にサブスクリプションタイプが含まれていない

2. サーバー側でサブスクリプションのサポートが有効になっていない

3. WebSocketの設定が正しくない

解決方法

1. スキーマにサブスクリプションタイプを追加する

まず、GraphQLスキーマにサブスクリプションタイプを追加しましょう。以下は簡単な例です:

type Subscription {
  newPost: Post
}

type Post {
  id: ID!
  title: String!
  content: String!
}

2. サーバー側でサブスクリプションを有効にする

使用しているGraphQLサーバーライブラリに応じて、サブスクリプションを有効にする必要があります。例えば、Apollo Serverを使用している場合は以下のように設定します:

const { ApolloServer } = require('apollo-server-express');
const express = require('express');
const http = require('http');
const { execute, subscribe } = require('graphql');
const { SubscriptionServer } = require('subscriptions-transport-ws');
const { makeExecutableSchema } = require('@graphql-tools/schema');

const app = express();
const httpServer = http.createServer(app);

const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

const server = new ApolloServer({
  schema,
  plugins: [{
    async serverWillStart() {
      return {
        async drainServer() {
          subscriptionServer.close();
        }
      };
    }
  }],
});

const subscriptionServer = SubscriptionServer.create(
  { schema, execute, subscribe },
  { server: httpServer, path: '/graphql' }
);

await server.start();
server.applyMiddleware({ app });

httpServer.listen(4000, () => {
  console.log(`Server ready at http://localhost:4000${server.graphqlPath}`);
});

3. WebSocket接続の設定を確認する

クライアント側でWebSocket接続が正しく設定されているか確認しましょう。Apollo Clientを使用している場合は、以下のように設定します:

import { ApolloClient, InMemoryCache, HttpLink, split } from '@apollo/client';
import { getMainDefinition } from '@apollo/client/utilities';
import { WebSocketLink } from '@apollo/client/link/ws';

const httpLink = new HttpLink({
  uri: 'http://localhost:4000/graphql'
});

const wsLink = new WebSocketLink({
  uri: `ws://localhost:4000/graphql`,
  options: {
    reconnect: true
  }
});

const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return (
      definition.kind === 'OperationDefinition' &&
      definition.operation === 'subscription'
    );
  },
  wsLink,
  httpLink
);

const client = new ApolloClient({
  link: splitLink,
  cache: new InMemoryCache()
});

まとめ

「Schema is not configured for subscriptions」エラーを解決するには、スキーマの定義、サーバー側の設定、クライアント側のWebSocket接続の3点を確認し、適切に設定する必要があります。これらの手順を踏むことで、GraphQLサブスクリプションを正常に動作させることができます。

エラー解決に困ったときは、使用しているライブラリやフレームワークの公式ドキュメントを参照することも有効です。GraphQLの最新動向やベストプラクティスにも常に注目し、より効率的な開発を心がけましょう。