質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

Q&A

解決済

1回答

1268閲覧

Vue3 axios Post、Laravel6 DBへ保存の際のエラー 500 (Internal Server Error)が解決できません。

tkm0604

総合スコア552

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

0グッド

0クリップ

投稿2022/05/28 02:06

編集2022/05/28 06:06

[実現したい事]
Vue3で作成したformの情報をaxios経由でLaravel DBへ保存したい。

[問題点]
DBへ保存できているのですが、
下記のエラーがLaravel Telescopeより確認できています。
イメージ説明

上記Telescopeエラーの見方を教えてください。
なぜ「POST /api/images 」が二つあり、一つで500のエラーが出ているのか?
「POST /api/images 」が二つある要因もよくわかりません。

処理の流れは、
1.Vue側で作成したformの内容をaxios api経由でlaravelへPOST
2.Laravel側でformの情報をaxios経由で受け取りDBへ保存
3.保存処理が終わると別のページへリダイレクト
となっています。

Laravelルートの処理は以下です。

api.php

1//formの作成ページ 2Route::get('api/images', 'ImageApiController@index')->name('images.index'); 3 4//formからの情報をDBに保存メソッドのルート 5Route::post('api/images', 'ImageApiController@store');

DB保存完了後のリダイレクト先ルート処理

web.php

1Route::get('show','HomeController@show')->name('show');

・Laravel側、データを受け取ってDBへ保存するstoreメソッド内にaxios経由の情報がNull。受け取れていません。(dd($)で確認済み)

[問題のコード]
formの情報をaxiosからPOSTする際は以下のコードを書いています。
FormData() に値が入っていない事が原因かと思い、いろんな箇所でconsole.log()してみると、全ての箇所で値が取得できています。

Vue.js

1〜〜省略〜〜 2 3 //new FormData() を作成 4 const data = new FormData(); 5 data.append("canvas", blob, "image/png"); 6 data.append("title", title.value); 7 data.append("comment", comment.value); 8 9 console.log(data.get("canvas")); 10 console.log(data.get("title")); 11 console.log(data.get("comment")); 12 console.log(data); 13 14 axios 15 .post("/api/images/", data, { 16 headers: { "content-type": "multipart/form-data" }, 17 }) 18 .then(res=> { 19 console.log("success"); 20 }) 21 .catch(error => { 22 new Error(error); 23 }); 24 }; 25

Laravelデータを受け取って保存するstoreメソッドは以下の様に書いています。
request()-> の値がすべてnullになっています。

public function store(Request $request, Image $image, TwitterOAuth $twitter) { /** * *Imageクラス、TwitterOAuthクラスはAppServiceProvider.phpに登録しています。 * */ //ログインユーザーのIDを保存 $image->user_id = auth()->user()->id; //タイトル保存処理 $image->title = request()->title; //コメント保存処理 $image->comment = request()->comment; //AWS S3画像保存処理 $file_name = request()->canvas; $path = Storage::disk('s3')->putFile('/', $file_name, 'public'); $image->image = $path; $image->save(); return redirect()->route('show', compact('image'))->with('message', '投稿を作成しました'); }

POST後にブラウザから

Symfony\Component\Debug\Exception\FatalThrowableError
Call to a member function hashName() on null
http://127.0.0.1:1180/api/images

となっており、該当のソースコードは
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php:240
return $this->putFileAs($path, $file, $file->hashName(), $options);

app/Http/Controllers/ImageApiController.php:55
$path = Storage::disk('s3')->putFile('/', $file_name, 'public');

となっております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natsume2233

2022/05/28 05:47

500エラー出た際のエラーの内容(internalのエラーメッセージだけでなく、ファイル名やコード行)がログに出力されていると思います。そちらの内容の追記して頂くと解決に近づくと思います。
tkm0604

2022/05/28 06:04

ありがとうござます。 POST後にブラウザから Symfony\Component\Debug\Exception\FatalThrowableError Call to a member function hashName() on null http://127.0.0.1:1180/api/images となっており、該当のソースコードは vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php:240 return $this->putFileAs($path, $file, $file->hashName(), $options); app/Http/Controllers/ImageApiController.php:55 $path = Storage::disk('s3')->putFile('/', $file_name, 'public'); となっております。
guest

回答1

0

自己解決

以下の様にformタグの中にaxiosからPOSTの処理を書いたvueコンポーネント埋め込んでいた事でPOSTが2回リクエストされている。1回目はPOSTに情報が入っているからDBにも保存処理されていたが、2回目のPOSTは何も情報が入っていないから、Laeavel側で全ての値がnull、status500のエラーが出ていました。

blade.php

1 <form method="POST" action="{{route('images.store')}}" enctype="multipart/form-data"> 2 @csrf 3 <image-component></image-component> 4 </form>

投稿2022/05/29 06:51

tkm0604

総合スコア552

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問