GCP

Cloud FunctionsでCloud Firestoreにデータを保存する方法

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

GoogleCloudPlatform の CloudFunctions で、Firebase の Firestore にデータを保存する方法についてまとめました。

はじめに

前回、

CloudFunctions を初めて触った記事

を書きました。

今回の記事では、

Cloud Functions で FIrebase にデータを保存する方法

について、順番に書いていきます。

前回の記事の続きから書いていくので、CloudFunctions の初期状態の作り方がわからない方は前回の記事をぜひ参考にしてみてください。

モジュールのインストール

コマンドひとつだけです。

functions ディレクトリに移動してコマンドを打つ

まず、ディレクトリを functions に移動します。

cd ~~~

モジュールをインストールする

npm i firebase-admin --save

これでモジュールがインストールできました。

package.json を確認する

  "dependencies": {
    "firebase-admin": "^8.12.1",
    "firebase-functions": "^3.6.1"
  },

無事インストールされました。

Firebase のデータベースを作成しにいく

image29

Firebase のコンソールにいって、左のメニューで database を選択するとこのような画面になります。

データベースの作成を押す。

テスト環境 →north-east

1 で作成します。

image30

このような画面になったら、OK です。

左上の歯車マークをクリック

Setting→ サービスアカウント → 秘密鍵の生成(json ファイルがダウンロードされる)

functions ディレクトリ配下に、「path」ディレクトリを作成

そして、その path ディレクトリにさきほどダウンロードした json ファイルをコピーして「key.json」というファイル名にします。

image31

こんな感じです。

apikey は見えてはいけないので、このままの状態では Github 等に保存しないようにしましょう。

今回はそういった作業を入れると蛇足となるのでこのままでいきます。

Firestore でデータを保存する

index.js を編集する

//index.js

const functions = require("firebase-functions");
const admin = require("firebase-admin");

var serviceAccount = require("./path/key.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  //databaseURLは各々のURLを出してください。
  databaseURL: "https://testapp-80832.firebaseio.com",
});

var db = admin.firestore();
var postsRef = db.collection("posts");

exports.helloWorld = functions.https.onRequest((request, response) => {
  postsRef.add({
    name: "テストテストテスト",
  });

  const getItems = async () => postsRef.get();

  async function item() {
    console.log("aaa");
    let answer = [];
    const items = await getItems();
    items.forEach((snap) => {
      answer.push(snap.data().name);
      console.log(snap.data().name);
    });
    response.send(answer);
  }
  item();
});

はい。これだとエラー出ますが、一旦起動してみましょう!

ターミナルで

firebase serve --only functions

これで functions を起動します。

エラーが出ました。

UnhandledPromiseRejectionWarning: Error: 9 FAILED_PRECONDITION: The Cloud Firestore API is not enabled

このエラーは、APIkey が許可されていないという意味らしいです(グーグル翻訳最高)

https://console.cloud.google.com/

image32

画像一番上らへん。testapp のところを、自分のプロジェクト名を指定する。

image33

画像の場所が、有効になっていれば OK です。

もう一度、起動します。

firebase serve --only functions

うごきましたか?

うまくいっていれば、テストが保存されて、「テスト」が保存されたと思います。

発動するたびにテストという文字列が加算されていくので、自分は今

こんなかんじになっています。

image3

解説

実際に Firebase Firestore に保存している箇所のコード

var db = admin.firestore();
var postsRef = db.collection("posts");
postsRef.add({
  name: "テストテストテスト",
});

これだけです。

こういう風に変数で定義してくのは公式ドキュメントのやり方なのですが、もちろん繋げてもいけます。

データを取得する方法

const getItems = async () => postsRef.get();

async function item() {
  const items = await getItems();
  items.forEach((snap) => {
    answer.push(snap.data().name);
  });
}
item();

データの取得はこれだけでできます。

Firebase のドキュメントに取得の方法は色々書いてあるので、みてみてください。

https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja

まとめ

CloudFunctions で Firestore にデータを保存して取得してみました。

① インストール

② Firebase 準備

③ json ファイルの設置

④ GCP 公式で有効にする

⑤ コードを書く

こんな流れでした!

わかりにくい部分は修正したりするので気軽に Twitter 等で声かけていただければと思います。