5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Lighthouse】Variablesを使ってスキーマを送る際に空文字がnullになる問題の対処法【Laravel + GraphQL】

Last updated at Posted at 2020-06-06

発生したこと

GraphQLのString!型に空文字を送ったところ、スキーマに直接値を書き込む形では空文字のまま渡されるが、Variablesを使用して代入すると空文字がnullに変換される。

  • スキーマ定義
schema.graphql
type Mutation {
    updateUser(id: ID! name: String!): User! @update
}

type User {
    id: ID!
    name: String!
}
  • 単体のスキーマの場合。
  • 正常に動作し、nameは空文字のものが返される。
mutation
mutation { 
  updateUser(
    id: 1
    name: ""
  ) {
    id
    name
  }
}
  • Variablesを使用してスキーマを使用した場合。
  • こちらではupdateUsernameにnullのリクエストを投げているというエラーが出る。
mutation
mutation UpdateUser(
  $id: ID!
  $name: String!
) { 
  updateUser(
    id: $id
    name: $name
  ) {
    id
    name
  }
}
variables
{
  "id": 1,
  "name": ""
}

環境

PHP: 7.2
Laravel: 6.2
Lighthouse: 4.11

原因

Lighthouseではリクエストのquerymutationといったスキーマの集合を一旦Laravelのリクエストとして受け取ってから引数の代入や個別のスキーマ毎に分解して処理を行っている。

その際にVariableを使用していると、それぞれのスキーマの引数に入れる際にLaravelのリクエストとして処理されてしまうため、グローバルミドルウェアのConvertEmptyStringsToNullが反応してしまい空文字がnullへと変換されていた。

解決方法

KernelConvertEmptyStringsToNullをコメントアウトなり削除なりする。

Kernel
class Kernel extends HttpKernel
{
    protected $middleware = [
//         コメントアウトする
//        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

最後に

原因がわかればなんてことはないエラーなのですが、面倒だからと直接クエリを書き換えて動作確認してたりするとなかなか気がつかない問題です。

エラーメッセージでもLighthouseで「String!にnullが送られてきている」みたいなものしか出なくて調査するのに結構手間取りました。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?