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