Nuxt.jsでFirebaseのRealtime Databaseにデータを取得する方法

Vue.js

Nuxt.jsでFirebaseのRealtime Databaseにデータを取得する方法を紹介します。

Nuxt.jsでFirebaseのRealtime Databaseにデータを取得する手順

  • store/index.jsを作成
  • axiosでGETリクエスト

FirebaseのRealtime Databaseにpostsというデータがあることを前提に進めます。
Firebaseにデータを送る方法は、Nuxt.jsでFirebaseのRealtime Databaseにデータを送る方法を参考にしてみてください。

ディレクトリ構造


root
├─ src
   ├─ components
   │   ├─ Admin
   │   │   ├─ AdminPostForm.vue
   ├─ components
   │   ├─ UI
   │   │   ├─ AppButton.vue
   │   │   ├─ AppControlInput.vue
   ├─ pages
   │   ├─ admin
   │   │   ├─ new-post
   │   │   │   ├─ index.vue
   ├─ store
   │   ├─ index.js

store/index.js

import Vuex from 'vuex'
import axios from 'axios'

const createStore = () => {
  return new Vuex.Store({
    state: {
      loadedPosts: []
    },
    mutations: {
      setPosts(state, posts) {
        state.loadedPosts = posts
      }
    },
    actions: {

    },
    getters: {
      loadedPosts(state) {
        return state.loadedPosts
      }
    }
  })
}

export default createStore

axiosを使うので、axiosをインポートします。

そして、actionsでGETリクエストを設定します。

nuxtServerInit()を使う

サーバーでレンダリングしたい場合、nuxtServerInit()を使います。
actionsの部分に次のように追記します。

    actions: {
      nuxtServerInit(vuexContext, context) {

      },
      setPosts(vuexContext, posts) {
        vuexContext.commit("setPosts", posts);
      }
    },

nuxtServerInitに関しては、Nuxt.jsのnuxtServerInitアクションの使い方を参考にしてみてください。

axiosでGETリクエストする

    actions: {
      nuxtServerInit(vuexContext, context) {
        return axios.get('https://[firebaseのurl].app/posts.json')
        .then()
        .catch(e => console.error(e))
      },
      setPosts(vuexContext, posts) {
        vuexContext.commit("setPosts", posts);
      }
    },

axiosの第一引数については、データを送った場所POSTリクエストで使ったurlと同じです。
そして、Promiseなので、then()メソッドでつなげます。

    actions: {
      nuxtServerInit(vuexContext, context) {
        return axios.get('https://[firebaseのurl].app/posts.json')
        .then(res => {
          const postsArray = []
          for (const key in res.data) {
            postsArray.push({ ...res.data[key], id: key })
          }
          vuexContext.commit('setPosts', postsArray)
        })
        .catch(e => console.error(e))
      },
      setPosts(vuexContext, posts) {
        vuexContext.commit("setPosts", posts);
      }
    },

データを格納する配列の変数を定義して、そこにforループで一つ一つデータをpush()メソッドで収めます。
データはオブジェクトで得たいので、スプレッド構文を使って、idを加えたオブジェクトにしています。
keyは、Firebaseが自動生成するidです。

Vue.js

Posted by devsakaso