【Nuxt.js+Firebase】ログイン不要！気軽に投稿できるオススメのカレー共有サイトを作りました！

#カレーの時代到来

近年、カレーブームがますます加速しているように思われます。

ちょうど今、西武池袋で行われてる[カレーイベント](https://www.sogo-seibu.jp/ikebukuro/topics/page/1468377.html)では連日行列が続き、
売り切れ商品も多数あるとのこと！

かくいう私も、カレーフリーク。
カレー専用の[Instagram](https://www.instagram.com/tawa.tawa.tawa/)を開設し、食べ歩いたカレーを投稿しています。

今回、静的サイトを作る練習として、__Nuxt.jsとFirebaseを使って、カレー屋さんの共有サイトを作ってみました！__

食べログやInstagramと違い、アカウントは不要、匿名で気軽に投稿できるのが特徴です♪
下記にリンクを貼っているので、ぜひ投稿してみてください！
#カレー共有サイト「Curry Freak」

__サイトURL ▶▶▶ https://curryfreak.ml/__ 


「新しいCurryを追加」のページから、投稿画面が確認できます。
[![Image from Gyazo](https://i.gyazo.com/4f5698c99cb5565856e6ad45a36c0810.png)](https://gyazo.com/4f5698c99cb5565856e6ad45a36c0810)

入力が完了すると、__投稿ボタンが出現！__
（アップロードが完了する前に投稿するとエラーになるので）
[![Image from Gyazo](https://i.gyazo.com/18f8a370a2b5ff219a485e7860491f81.png)](https://gyazo.com/18f8a370a2b5ff219a485e7860491f81)

投稿ボタンを押すと、「Curry一覧」ページに遷移して、
投稿したカレー屋さん情報をご覧いただけます♪
[![Image from Gyazo](https://i.gyazo.com/c00fc906d1ea59069f9c310199eced6c.png)](https://gyazo.com/c00fc906d1ea59069f9c310199eced6c)

#作り方

まずNuxt.jsでプロジェクトを作成（[参考記事](https://qiita.com/kaiser355/items/54c9ae11db227ec44374)）
UIフレームワークを選べるので、今回[Buefy](https://buefy.org/)を選択しました。
▽
```yarn add firebase```でFirebaseのライブラリを追加
▽
```yarn dev``` で動作確認しながら、ページやコンポーネントを作成
▽
UIをちょこっと修正
▽
```yarn generate```を実行し、distフォルダをNetlifyでデプロイ
▽
独自ドメインを設定して、完成♪（[参考記事](https://note.com/dafujii/n/n406f385651e2)）


ページなどのソースコードはgithubにあげたのでご覧ください！

__ソースコード ▶▶▶ https://github.com/twtjudy1128/CurryFreak_new__ 


#つまずいたところ
###Firebaseの呼び出し

序盤で「Firebase App named '[DEFAULT]' already exists」というエラーが出て進まず。
[![Image from Gyazo](https://i.gyazo.com/d3904f8a265d2f7406e54f782e3ffff7.png)](https://gyazo.com/d3904f8a265d2f7406e54f782e3ffff7)

[こちら](https://qiita.com/taskeknight/items/332fb23160b0ab8a52e7)の記事を拝見し、
何度もFirebaseを初期化して呼び出してしまっていることが原因だとわかったので、
以下のように初期化のコードを修正したら、すぐエラーが消えました♪

```js
            // Initialize Firebase
            if (firebase.apps.length === 0) {
            firebase.initializeApp(config);
            }
```


###V-modelの使い方

v-onとv-bindをまとめて書くことができるv-model。
フォームで色んな人が使ってるのを見て、私も投稿画面で使ってみました。

```html
    　<div class="postform">
        <div>
          <input v-model="title" placeholder="店名"><br>
          <input v-model="name" placeholder="名前"><br>
          <input v-model="memo" placeholder="ひとこと"><br>
          <input v-show="!image_url" type="file" id="image_file" @change="onFileChange"  accept="image/*" required/>
          <b-button type="is-warning" v-on:click='post' v-show="show"><b>投稿</b></b-button>
        </div>
      </div>
```

ところが、以下のように真っ赤になっちゃいました＞＜

[![Image from Gyazo](https://i.gyazo.com/88e71b051416bd33d789e5a90f30ee45.png)](https://gyazo.com/88e71b051416bd33d789e5a90f30ee45)

調べると、対応するデータが定義されていなかったので、script部分で、以下のように定義。

```js
data(){
    return {
      image_url: null,
      title:'',
      name:'',
      memo:'',
      downloadURL:'',
      show: false,
    };
```

すると今度は、以下のエラー

>The “data” option should be a function that returns a per-instance value in component definitions.

子コンポーネントでは、dataをオブジェクトではなく、関数として定義する必要があるとのこと・・・（難しい）
というわけで、以下のようにちょこっと変更しただけでエラーが綺麗に消えました！

```js
data:function(){
    return {
      image_url: null,
      title:'',
      name:'',
      memo:'',
      downloadURL:'',
      show: false,
    };
```


【参考記事】
▶[Vue.jsのv-modelを正しく使う](https://qiita.com/simezi9/items/c27d69f17d2d08722b3a)
▶[【Vue.js】The “data” option should be a function that returns a per-instance value in component definitions.というエラーについて](https://toshiki-tsuji.com/%E3%80%90vue-js%E3%80%91the-data-option-should-be-a-function-that-returns-a-per-instance-value-in-component-definitions-%E3%81%A8%E3%81%84%E3%81%86%E3%82%A8%E3%83%A9%E3%83%BC)



###画像とテキストを一緒に投稿する

1番苦戦したところです。笑

[![Image from Gyazo](https://i.gyazo.com/c3830835c9d8aa74e7c408bbddd9cac6.png)](https://gyazo.com/c3830835c9d8aa74e7c408bbddd9cac6)


上記のような構造を目指して、あーだこーだやってみたのですがエラー続きで心折れかけました。笑

その時に、__[GyazoやimgurのAPIを使う方法](https://qiita.com/ErgoFriend/items/acb61dda0121acbed531#vue)__を見つけたのでトライしてみることに。
ところが、GyazoAPIはアクセス権限で引っかかり使えず…。

imgurで試してみたのですが、下記のようなエラーが出ました…（今だ解決しておらず）
[![Image from Gyazo](https://i.gyazo.com/724695b45f1d0e279b9ba49f9515adce.png)](https://gyazo.com/724695b45f1d0e279b9ba49f9515adce)

かなり苦戦していたのですが、 @tkyko13 さんにご協力いただき、
本来やりたかったFirebase StorageとCloud Firestoreを使った方法でうまく投稿できるようになりました。（大感謝）

コード長くなるので、ソースコードのpost.vueをご覧いただけると幸いです！
__ソースコード ▶▶▶ https://github.com/twtjudy1128/CurryFreak_new__

#心残りなPOINT
・投稿日時も入れればよかった
・投稿した順に表示できるようにしたい
・画像をアップロードしている間、「アップロード中」のクルクルみたいのを出したい
・UIをもっと綺麗にしたい（フレームワークは便利だけどカスタムのコツがまだ掴めてない）
・ロゴを作りたい
・もう1つページを増やして、おふざけ要素作りたかった

色々やりたいこと挙げるとキリがないですね・・・
でも、手こずりながらも、また１つアウトプットできたことが嬉しいです。

#あなたのオススメのカレー屋さんを教えてください♪

最後までご覧いただき、ありがとうございます！
匿名で簡単に投稿できるので、是非あなたのオススメカレーを投稿してみてくださいね！

__カレー共有サイト「Curry Freak」 ▶▶▶ https://curryfreak.ml/__
(9/11 0:30現在　ストレージの制限超過で画像表示されなくなっています)

みんなでカレー食べて、免疫つけて、今日も１日がんばりまっしょー！！！！！

###(*^^)v「よろしければLGTMも宜しくお願いします！」

　

＜9/10 18:28追記＞
もうこんなに投稿集まってきました～ありがとうございます！
こういう機能も欲しいなどフィードバックもいただけて嬉しいです！
バシバシ投稿よろしくお願いします！
[![Image from Gyazo](https://i.gyazo.com/026aabd185dd58acbb98f8fc60951439.png)](https://gyazo.com/026aabd185dd58acbb98f8fc60951439)

※私の独断で不適切だと思った画像は随時削除しております。ご了承ください。

＜9/11 0:30追記＞
　ストレージの制限超過で一時的に画像が表示されなくなってしまいました…。
でも、それだけ多くのアクセスがあったということなので、前向きに捉えていこうと思います！
　こういう事態に直面しないと、自分では予測できなかったと思うので、これを機にリサイズの実装などもできないか検討してみようと思います。

＜9/11 16:22追記＞
画像復活しました！どうやら1日1GBという制限があるようです。やはりリサイズが必要ですねん。