GraphQLを使用していると、「Variable "$X" got invalid value; Expected type "Y"」というエラーに遭遇することがあります。このエラーは、GraphQLクエリやミューテーションに渡された変数の型が、スキーマで定義された型と一致しない場合に発生します。本記事では、このエラーの原因と解決方法について詳しく説明します。

エラーの原因

このエラーは主に以下の理由で発生します:

1. 変数の型が間違っている

2. 必須フィールドが欠けている

3. 配列の要素の型が正しくない

4. 列挙型の値が無効

解決方法

1. 変数の型を確認する

まず、GraphQLスキーマで定義された型と、実際に渡している変数の型が一致しているか確認しましょう。例えば、整数型(Int)を期待しているのに文字列(String)を渡していないか確認します。

# 正しい例
mutation ($id: Int!) {
  updateUser(id: $id) {
    name
  }
}

# 変数
{
  "id": 123
}

# 間違った例(エラーの原因)
{
  "id": "123"
}

2. 必須フィールドを確認する

GraphQLでは、`!`記号で必須フィールドを表します。必須フィールドが欠けていないか確認しましょう。

# スキーマ
type User {
  id: ID!
  name: String!
  email: String
}

# 正しい例
mutation ($user: UserInput!) {
  createUser(input: $user) {
    id
  }
}

# 変数
{
  "user": {
    "name": "John Doe",
    "email": "john@example.com"
  }
}

# 間違った例(nameが必須なのに欠けている)
{
  "user": {
    "email": "john@example.com"
  }
}

3. 配列の要素の型を確認する

配列を使用する場合、各要素の型が正しいか確認します。

# スキーマ
input TaskInput {
  title: String!
  tags: [String!]
}

# 正しい例
mutation ($task: TaskInput!) {
  createTask(input: $task) {
    id
  }
}

# 変数
{
  "task": {
    "title": "新しいタスク",
    "tags": ["仕事", "重要"]
  }
}

# 間違った例(tagsに数値が含まれている)
{
  "task": {
    "title": "新しいタスク",
    "tags": ["仕事", 123]
  }
}

4. 列挙型の値を確認する

列挙型(Enum)を使用している場合、定義された値のいずれかを使用しているか確認します。

# スキーマ
enum UserRole {
  ADMIN
  USER
  GUEST
}

# 正しい例
mutation ($role: UserRole!) {
  updateUserRole(role: $role) {
    id
  }
}

# 変数
{
  "role": "ADMIN"
}

# 間違った例(定義されていない値)
{
  "role": "SUPERUSER"
}

まとめ

「Variable "$X" got invalid value; Expected type "Y"」エラーを解決するには、以下の点に注意しましょう:

  • 変数の型が正しいか確認する
  • 必須フィールドが全て含まれているか確認する
  • 配列の要素が正しい型であるか確認する
  • 列挙型の値が定義された範囲内であるか確認する

これらの点に注意して変数を適切に設定することで、エラーを解決し、GraphQLクエリやミューテーションを正常に実行できるようになります。

GraphQLの型システムを理解し、適切に使用することで、より堅牢なアプリケーションを開発することができます。エラーメッセージをよく読み、スキーマとの整合性を常に意識することが重要です。