🤖
フロントからバックに送ったデータに予期しないvalidationがかかる(かかっていたと勘違い)問題
概要
簡単なアプリケーションを作るプチハッカソンみたいなことをしていて、
私はバックエンドを担当した。
フロント: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