Cloud FunctionsでCloud Firestoreにデータを保存する方法
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
GoogleCloudPlatform の CloudFunctions で、Firebase の Firestore にデータを保存する方法についてまとめました。
はじめに
前回、
を書きました。
今回の記事では、
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 のデータベースを作成しにいく
Firebase のコンソールにいって、左のメニューで database を選択するとこのような画面になります。
データベースの作成を押す。
テスト環境 →north-east
1 で作成します。
このような画面になったら、OK です。
左上の歯車マークをクリック
Setting→ サービスアカウント → 秘密鍵の生成(json ファイルがダウンロードされる)
functions ディレクトリ配下に、「path」ディレクトリを作成
そして、その path ディレクトリにさきほどダウンロードした json ファイルをコピーして「key.json」というファイル名にします。
こんな感じです。
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/
画像一番上らへん。testapp のところを、自分のプロジェクト名を指定する。
画像の場所が、有効になっていれば OK です。
もう一度、起動します。
firebase serve --only functions
うごきましたか?
うまくいっていれば、テストが保存されて、「テスト」が保存されたと思います。
発動するたびにテストという文字列が加算されていくので、自分は今
こんなかんじになっています。
解説
実際に 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 等で声かけていただければと思います。