【Firebase】Cloud Functions for Firebase to Cloud Firestoreの接続実験を行っていく

はじめに

こんにちは、がんがんです。
前回の記事ではCloud Functions for Firebase on Docker環境からFIrebase Realtime Databaseへの接続を行っていきました。
gangannikki.hatenadiary.jp

今回はCloud Functions for Firebase(nodejs:8)からCloud Firestoreの接続実験を行っていきました。

目的

  • Cloud Functionsの実験を行う
  • FunctonsからFirestoreへの書き込み実験

参考

GoogleさんのものはCodelabにコードがあることが多いのでとても助かります。

Codelabのコード
codelabs.developers.google.com

firebase公式のgithub
github.com

firebase公式のドキュメント
firebase.google.com


今回もGitHubのコードとドキュメントをベースにしながら実験を行っていきます。

index.jsの編集

Docker環境については前回の記事の通りです。今回もnode:8で実行しています。
index.jsのコードは下記の通りです。前回同様に基本的には本家のコピペです。

'use strict';

// [START all]
// [START import]
// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Cloud Firestore.
const admin = require('firebase-admin');
admin.initializeApp();
// [END import]

// [START addMessage]
// Take the text parameter passed to this HTTP endpoint and insert it into 
// Cloud Firestore under the path /messages/:documentId/original
// [START addMessageTrigger]
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // [END addMessageTrigger]
    // Grab the text parameter.
    const original = req.query.text;
    // [START adminSdkAdd]
    // Push the new message into Cloud Firestore using the Firebase Admin SDK.
    const writeResult = await admin.firestore().collection('messages').add({original: original});
    // Send back a message that we've succesfully written the message
    res.json({result: `Message with ID: ${writeResult.id} added.`});
    // [END adminSdkAdd]
  });
  // [END addMessage]
  
  // [START makeUppercase]
  // Listens for new messages added to /messages/:documentId/original and creates an
  // uppercase version of the message to /messages/:documentId/uppercase
  // [START makeUppercaseTrigger]
  exports.makeUppercase = functions.firestore.document('/messages/{documentId}')
      .onCreate((snap, context) => {
  // [END makeUppercaseTrigger]
        // [START makeUppercaseBody]
        // Grab the current value of what was written to the Cloud Firestore.
        const original = snap.data().original;
        console.log('Uppercasing', context.params.documentId, original);
        const uppercase = original.toUpperCase();
        // You must return a Promise when performing asynchronous tasks inside a Functions such as
        // writing to the Cloud Firestore.
        // Setting an 'uppercase' field in the Cloud Firestore document returns a Promise.
        return snap.ref.set({uppercase}, {merge: true});
        // [END makeUppercaseBody]
      });
  // [END makeUppercase]
  // [END all]

プロジェクトの実行およびfunctionのデプロイ

いつも通り、Docker Composeで起動していきます。前回の関数が残ってる場合はデプロイ出来ないので、Firebaseコンソールより消してからデプロイしてください。どうやら同じ名前で中身の異なるものはfirebaseさんに怒られるようです。

(host os) $ docker-compose up -d && docker-compose exec app bash
(docker) $ firebase login --no-localhost
(docker) $ firebase deploy 

実行結果の確認

上手くデプロイできたかを確認してみます。ドキュメントを参考に、Firebaseコンソールで表示されたURLにアクセスしてみます。
これも前回と同じですね。

https://<表示URL>?text=uppercasemetoo

下記のような画像になっていればOKです。画像が上記の文字とは異なりますが、同じようになってればどんな文字列でも大丈夫です。

f:id:gangannikki:20200226185840j:plain
Cloud Firestoreの結果画像

おわりに

今回はCloud FunctionsからCloud Firestoreへの接続実験を行いました。
次回は自身の作成したいものを作っていきます。こちらについてはどこかでまとめていけたらと思ってます。