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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4962閲覧

ajaxを使ってPOSTした結果error 500になってしまう原因が分かりません。

nakaji-junk

総合スコア3

Vue.js

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2021/02/24 06:56

Herokuで公開した自作アプリでのPOSTした際にserver errror 500が返る原因と対策をご教授ください。
###問題点
Vueファイル内のformData APIをPOSTするとserver error 500が返ってきます。
Laravelを使用しています。

※lockalhost:8000ではエラーにならずに正常にPOSTできAWS S3に保存されます。
GETで取得・表示することもできています。

※問題はHerokuで公開したURLで同じようにPOSTをする時だけserver error 500となってしまうことです。
###コンソールエラー

error

1app.js:14719 POST https://portfolio-vue-laravel.herokuapp.com/api/photos 500 (Internal Server Error) 2dispatchXhrRequest @ app.js:14719 3xhrAdapter @ app.js:14553 4dispatchRequest @ app.js:15199 5Promise.then (async) 6request @ app.js:14976 7Axios.<computed> @ app.js:15001 8wrap @ app.js:15565 9_callee$ @ app.js:17629 10tryCatch @ app.js:19187 11invoke @ app.js:19417 12(anonymous) @ app.js:19242 13asyncGeneratorStep @ app.js:17535 14_next @ app.js:17537 15(anonymous) @ app.js:17537 16(anonymous) @ app.js:17537 17submit @ app.js:17665 18submit @ app.js:22527 19invokeWithErrorHandling @ app.js:28295 20invoker @ app.js:28620 21original._wrapper @ app.js:33979

error

1[Vue warn]: Error in v-on handler (Promise/async): "Error: Request failed with status code 500" 2 3found in 4 5---> <PhotoForm> at resources/js/pages/PhotoForm.vue 6 <App> at resources/js/App.vue 7 <Root> 8warn @ app.js:27066 9logError @ app.js:28325 10globalHandleError @ app.js:28320 11handleError @ app.js:28280 12(anonymous) @ app.js:28297 13Promise.catch (async) 14invokeWithErrorHandling @ app.js:28297 15invoker @ app.js:28620 16original._wrapper @ app.js:33979

error

1app.js:28329 Error: Request failed with status code 500 2 at createError (app.js:15133) 3 at settle (app.js:15394) 4 at XMLHttpRequest.handleLoad (app.js:14602) 5logError @ app.js:28329 6globalHandleError @ app.js:28320 7handleError @ app.js:28280 8(anonymous) @ app.js:28297 9Promise.catch (async) 10invokeWithErrorHandling @ app.js:28297 11invoker @ app.js:28620 12original._wrapper @ app.js:33979

###該当コード

Vue

1<template> 2 <div class="postPhoto"> 3 <h3>投稿する写真を選んでください</h3> 4 <form class="postPhoto_form" @submit.prevent="submit"> 5 6 <input type="file" class="postPhoto_form-item" 7 @change="onFileChange" 8 name="file"> 9 10 <output class="postPhoto_form-output" v-if="preview"> 11 <img :src="preview" alt=""> 12 </output> 13 14 <div class="postPhoto_form-button"> 15 <button type="submit" class="button">送信</button> 16 </div> 17 </form> 18 </div> 19</template>

Vue

1<script> 2export default { 3 data() { 4 return { 5 preview: null, 6 photo: null, 7 } 8 }, 9 methods: { 10 onFileChange(event) { 11 const reader = new FileReader() 12 reader.onload = e => { 13 this.preview = e.target.result 14 } 15 reader.readAsDataURL(event.target.files[0]) 16 this.photo = event.target.files[0] 17 }, 18 19 reset() {略}, 20 21 async submit() { 22 const formData = new FormData() 23 if (this.photo !== "") { 24 formData.append('photo', this.photo) 25 } 26 const config = { headers: { "content-type": "multipart/form-data" } }; 27 const response = await axios.post('/api/photos', formData, config) 28 29 if (response.status === UNPROCESSABLE_ENTITY) { 30 this.errors = response.data.errors 31 console.log(this.errors); 32 return false 33 } 34 35 this.reset() 36 37 if (response.status !== CREATED) { 38 this.$store.commit('error/setCode', response.status) 39 return false 40 } 41 42 this.$router.push(`/photoList`) 43 }, 44 } 45} 46</script>

PhotoControllerphp

1 /** 2 * 写真投稿 3 * @param StorePhoto $request 4 * @return \Illuminate\Http\Response 5 */ 6 public function create(StorePhoto $request) 7 { 8 // 投稿写真の拡張子を取得する 9 $extension = $request->photo->extension(); 10 11 $photo = new Photo(); 12 13 // インスタンス生成時に割り振られたランダムなID値と 14 // 本来の拡張子を組み合わせてファイル名とする 15 $photo->filename = $photo->id . '.' . $extension; 16 17 // S3にファイルを保存する 18 // 第三引数の'public'はファイルを公開状態で保存するため 19 Storage::cloud() 20 ->putFileAs('', $request->photo, $photo->filename, 'public'); 21 22 // データベースエラー時にファイル削除を行うため 23 // トランザクションを利用する 24 DB::beginTransaction(); 25 26 try { 27 Auth::user()->photos()->save($photo); 28 DB::commit(); 29 } catch (\Exception $exception) { 30 DB::rollBack(); 31 // DBとの不整合を避けるためアップロードしたファイルを削除 32 Storage::cloud()->delete($photo->filename); 33 throw $exception; 34 } 35 36 // リソースの新規作成なので 37 // レスポンスコードは201(CREATED)を返却する 38 return response($photo, 201); 39 }

StorePhotophp

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class StorePhoto extends FormRequest 8{ 9 /** 10 * Determine if the user is authorized to make this request. 11 * 12 * @return bool 13 */ 14 public function authorize() 15 { 16 return true; 17 } 18 19 /** 20 * Get the validation rules that apply to the request. 21 * 22 * @return array 23 */ 24 public function rules() 25 { 26 return [ 27 'photo' => 'required|file|mimes:jpg,jpeg,png,gif' 28 ]; 29 } 30}

Photophp

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Support\Arr; 7use Illuminate\Support\Facades\Storage; 8 9class Photo extends Model 10{ 11 /** プライマリキーの型 */ 12 protected $keyType = 'string'; 13 14 /** JSONに含める属性 */ 15 protected $visible = [ 16 'id', 'owner', 'url', 'created_at' 17 ]; 18 19 /** JSONに含める属性 */ 20 protected $appends = [ 21 'url', 22 ]; 23 24 /** IDの桁数 */ 25 const ID_LENGTH = 12; 26 27 public function __construct(array $attributes = []) 28 { 29 parent::__construct($attributes); 30 31 if (! Arr::get($this->attributes, 'id')) { 32 $this->setId(); 33 } 34 } 35 36 /** 37 * ランダムなID値をid属性に代入する 38 */ 39 private function setId() 40 { 41 $this->attributes['id'] = $this->getRandomId(); 42 } 43 44 /** 45 * ランダムなID値を生成する 46 * @return string 47 */ 48 private function getRandomId() 49 { 50 $characters = array_merge( 51 range(0, 9), range('a', 'z'), 52 range('A', 'Z'), ['-', '_'] 53 ); 54 55 $length = count($characters); 56 57 $id = ""; 58 59 for ($i = 0; $i < self::ID_LENGTH; $i++) { 60 $id .= $characters[random_int(0, $length - 1)]; 61 } 62 63 return $id; 64 } 65 66 /** 67 * アクセサ - url 68 * @return string 69 */ 70 public function getUrlAttribute() 71 { 72 return Storage::cloud()->url($this->attributes['filename']); 73 } 74 75 /** 76 * リレーションシップ - usersテーブル 77 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 78 */ 79 public function owner() 80 { 81 return $this->belongsTo('App\User', 'user_id', 'id', 'users'); 82 } 83}

ローカルホストではAWS S3に保存できているのでenvファイルの設定は正しいかと思います。

コンソールエラーからリクエストに問題があるように見えるのですがどこがどう間違っているのかが分かりませんでした。
色々調べた結果formData APIはmacOSやSafariで上手く送信できないととかも拝見したのですが結局よく分かりませんでした。
そもそもローカルホストでは正常に動いているのでHeroku公開でのサイトではAWS S3へ接続がうまくできていないのでしょうか。
どなたかご教授のほどを宜しくお願いします。

###環境

  • vue:2.6.12
  • PHP:7.4.13
  • Laravel:2.3.0
  • MySQL:8.0.22 for osx10.13 on x86_64 (Homebrew)
  • macOS High Sierra 10.13.6

参考にしたサイト

https://www.hypertextcandy.com/vue-laravel-tutorial-introduction/
こちらの記事を参考に作成しています。

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

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

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

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

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

yambejp

2021/02/24 07:05

axiosではなく普通にsubmitすればちゃんと戻ってくるのでしょうか?
m.ts10806

2021/02/24 07:06

ログは確認されましたか? 500エラーは多岐に渡るのでコードだけ確認すればいいとは限りません
nakaji-junk

2021/02/24 07:12

yambejpさん m.ts10806さん コメントありがとうございます。 時間の都合上明日確認してみます。
Lulucom

2021/02/24 07:32

> envファイルの設定は正しいかと思います。 ローカルでは.envファイルで環境変数を設定しますが、Herokuでは.envファイルは参照されませんのでheroku config:set ... のコマンドで環境変数を設定する必要があります。
nakaji-junk

2021/02/24 10:34

Lulucomさん コメントありがとうございます。 明日確認してみます。
nakaji-junk

2021/02/25 05:24

Lulucomさん heroku config:setでの環境変数を設定することで無事にPOSTができました! コメント頂いた皆さんありがとうございました。
guest

回答1

0

ベストアンサー

JSのエラーから原因が分かることはないので見ても無駄。
本番環境ではLaravelから外に詳細なエラーメッセージが出ることはない。
500=何も情報がないのと同じ。

Laravel側のエラーログを見ないと解決しない。
herokuではstorage/logsには保存されないのでstderr使うように設定が必要。
https://devcenter.heroku.com/ja/articles/php-logging

投稿2021/02/24 07:17

kawax

総合スコア10377

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

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

nakaji-junk

2021/02/25 05:26

ご回答ありがとうございました。 コメント頂いた中から解決に至りました。 本番環境でのエラーログの確認の仕方を勉強させて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問