🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

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

Laravel

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

解決済

1回答

3545閲覧

EC2にデプロイすると配列がオブジェクトに変換され、this.items.slice is not a function というエラーが出る

Take.Y

総合スコア12

Vue.js

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

Laravel

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

0クリップ

投稿2021/02/26 02:32

Laravel / Vue / AWS を用いてポートフォリオを作成しています。「単語一覧を表示する機能」を実装したいのですが、ローカルではうまく機能してたのですが、EC2上にデプロイしたところ表示がされなくなってしまいました。コンソールとMySQLを確認したところ、単語の追加と保存はできているので、表示だけうまくいかない状況です。

#環境

amazon linux 2
PHP 7.3.26
Laravel Framework 6.20.16
vue@2.6.12

#該当のコード

php

1class WordController extends Controller 2{ 3 public function index() { 4 5 $user_id = Auth::id(); 6 $words = Word::all()->where('user_id', $user_id); 7 return response()->json($words); 8 9 } 10

vue

1data () { 2 return { 3 //取得したデータを配列に格納 4 words: [], 5     //以下略

vue

1// axiosを用いてデータを取得 2requestMyWord: function() { 3 axios.get('/api/word').then((res)=>{ 4 this.words = res.data; 5 console.log(res.data); 6 }); 7 },

現状上記のようにしていて、

Invalid prop: type check failed for prop "items". Expected Array, got Object

this.items.slice is not a function

という2つのエラーが出ています。

調べてみたところ原因としてはどちらも、「オブジェクトではなく配列で返せ」ということだと思うのですが、同じコードを書いているのにローカルで起動した際には配列、EC2にデプロイするとオブジェクトに変換されてしまいます。

ローカルで起動 ↓
ローカルで起動した時

EC2で起動 ↓
イメージ説明

#試してみたこと

とりあえず「オブジェクトを配列に返す」ことで改善されると思い、以下を試しました。

##① response()->json で返す

php

1public function index() { 2 3 $user_id = Auth::id(); 4 $words = Word::all()->where('user_id', $user_id); 5 return response()->json($words); 6 7 }

参考 https://qiita.com/qiita-kurara/items/089db7349e33b9402b42

##② [] を使う

php

1public function index() { 2 3 $user_id = Auth::id(); 4 $words = Word::all()->where('user_id', $user_id); 5 return [$word]; 6 7 }

参考 https://qiita.com/qiita-kurara/items/089db7349e33b9402b42

##③ array

php

1public function index() { 2 3 $user_id = Auth::id(); 4 $words = Word::all()->where('user_id', $user_id); 5 return array($word); 6 7 }

##④ toArray()

php

1public function index() { 2 3 $user_id = Auth::id(); 4 $words = Word::all()->where('user_id', $user_id); 5 return $words->toArray(); 6 7 }

参考 https://readouble.com/laravel/5.8/ja/collections.html#method-toarray

##⑤ json_decode

php

1 public function index() { 2 3 $user_id = Auth::id(); 4 $words = Word::all()->where('user_id', $user_id); 5 return $array = json_decode(json_encode($words), true);; 6 7 }

https://qiita.com/ymm1x/items/f197ddd327356b1e9088#%E6%96%B9%E6%B3%952-get_object_vars-%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86

⑥ get_object_vars 関数

php

1 public function index() { 2 3 $user_id = Auth::id(); 4 $words = Word::all()->where('user_id', $user_id); 5 return get_object_vars($words);; 6 7 }

上記6点試してみましたが、相変わらずエラーが出る状態、または 「配列はできエラーは消えるが、配列の中にオブジェクトが生成される(?)状態になり、表示はされません。

イメージ説明

自分が見落としてる点もあると思いますが、お力添えいただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

Lulucom

2021/02/26 04:20 編集

そのVueコンポーネントのitemsプロパティにどう値を渡しているかがわかるようなコードの掲載も必要ではないでしょうか。 以下のエラーが「不正なプロパティ: itemsプロパティの型チェックに失敗。配列を期待したのにオブジェクトだった」と言っているためです。 > Invalid prop: type check failed for prop "items". Expected Array, got Object
Lulucom

2021/02/26 04:20 編集

(すみません消しました)
guest

回答1

0

ベストアンサー

$wordsの中身がクエリビルダのままになってしまっているのかと思います。
all()で取得されたコレクションをwhere()で絞り込むのではなく
以下のようにget()あるいはpaginate()の結果を返すようにするとどうでしょうか。

php

1$words = Word::where('user_id', $user_id)->get(); 2// あるいは 3$words = Word::where('user_id', $user_id)->paginate(); 4 5return $words;

投稿2021/02/26 09:35

編集2021/02/28 01:12
Lulucom

総合スコア1899

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

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

Lulucom

2021/02/26 09:43

ごめんなさい、たぶん、外していますね。ローカルでは正常に動くのでしたね。
Take.Y

2021/02/27 01:51 編集

Lulucom 様 $words = Word::where('user_id', $user_id)->get(); こちらで正常に表示されました!! なぜデプロイした際に表示できなくなったのかは分かりませんが、、 お忙しい中ありがとうございました。
Lulucom

2021/02/27 01:54

getやpaginateを書き忘れることってたまにありますよね。よかったです^ ^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問