🤖

フロントからバックに送ったデータに予期しないvalidationがかかる(かかっていたと勘違い)問題

2024/11/23に公開

概要

簡単なアプリケーションを作るプチハッカソンみたいなことをしていて、
私はバックエンドを担当した。

フロント:react
バックエンド:Laravel

で会員登録機能の作成をしていて、ポストマンで叩いたりしているときはいけているのに、なぜかフロントからのデータだと422のvalidationに引っかかってしまって沼った。

結論

HTTPリクエストヘッダーに

Content-Type: application/json

がなかったため、Laravelできちんと認識されず情報がnullで解釈されていたためvalidationによって弾かれていた。

リクエストする時のコードを

const response = await fetch('http://localhost:80/api/users', {
      method: 'POST',
      body: JSON.stringify(data),
    });
const response = await fetch('http://localhost:80/api/users', {
      method: 'POST',
      headers: {
            'Content-Type': 'application/json',
          },
      body: JSON.stringify(data),
    });

こうするだけできちんと送るデータが解釈された。

Laravelのログ挟んで確認してみると

Log::info('Request Data: ' . json_encode($request->all()));
root@09139382ddd9:/var/www/html/storage/logs# tail -2 laravel.log
[2024-11-23 11:24:28] local.INFO: Request Data: []
[2024-11-23 11:25:20] local.INFO: Request Data: {"name":"\u30c6\u30b9\u30c81","email":"tes1t@test.com","password":"testtest"}

こんな感じで、書いてないときはきちんと解釈されていなかった。

それはvalidationで引っかかるはずである。

教訓

チーム開発における協力体制というのも大切だと改めて痛感
臆さず、チーム開発においては伝えるべきことはきちんと伝える。

この解決の際に途中でこんな感じでnullで解釈されていることに気づいてフロント担当の方に伝えたのだが、
(このとき試しにvalidationのrequiredとかを全部外してどうなるか試していた。エラーコードは500。)

local.ERROR: SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: users.name (Connection: sqlite, SQL: insert into "users" ("name", "email", "password", "updated_at", "created_at") values (?, ?, $2y$12$v/k5hF0Np46k4bjV3GPPTOZVBTwprabhiNFERXrIRplCsxQoItFV., 2024-11-22 09:05:07, 2024-11-22 09:05:07)) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: users.name (Connection: sqlite, SQL: insert into \"users\" (\"name\", \"email\", \"password\", \"updated_at\", \"created_at\") values (?, ?, $2y$12$v/k5hF0Np46k4bjV3GPPTOZVBTwprabhiNFERXrIRplCsxQoItFV., 2024-11-22 09:05:07, 2024-11-22 09:05:07)) at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:825)
[stacktrace]

フロント担当の方にうまく伝わらずに、結局バック側のどこかに問題があるのでは無いかとバックのログを終始睨めっこして解決策を探そうとしていた。

箇所が間違っているのであるから、それは解決できないはずである。

チーム開発における協力体制というのも大切だと改めて痛感した。

Discussion