やること
Firebaseで便利に使えるデータベース"Firestore"にデータを書き込み、読み書きしてみます。環境はnode.js。
参考にしたサイト
プロジェクトの作成
firebaseポータルからプロジェクトの作成
プロジェクトに名前を付ける
GoogleAnalyticsは有効化する
データベースの作成
データベースのセキュリティ保護ルール設定
ひとまずテストモードで作成
テストモード
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
ロックモード
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
データベースのロケーション設定
asiaを選んでトラブるのは嫌なのでusを選択。
データベースが完成
データベースの初期化
環境の作成
PS C:\Users\[ユーザー名]> npm install firebase-admin --save
> protobufjs@6.8.8 postinstall C:\Users\[ユーザー名]\node_modules\protobufjs
> node scripts/postinstall
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\[ユーザー名]\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\[ユーザー名]\package.json'
npm WARN sass-loader@7.2.0 requires a peer of webpack@^3.0.0 || ^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN vue-chartjs@3.4.2 requires a peer of chart.js@>= 2.5 <= 2.8 but none is installed. You must install peer dependencies yourself.
npm WARN [ユーザー名] No description
npm WARN [ユーザー名] No repository field.
npm WARN [ユーザー名] No README data
npm WARN [ユーザー名] No license field.
+ firebase-admin@8.6.0
added 139 packages from 115 contributors and audited 2232 packages in 36.75s
found 0 vulnerabilities
データベースの初期化
さて、ここでマニュアルでは3つの選択肢が提示される。
- Cloud Functions で初期化する
- Google Cloud Platform で初期化する
- 各自のサーバーで初期化する
この3つのうちどれがいいの?やっぱ、一番上に書いてあるやり方が推奨なの?と初心者ながらに思ってしまったが…。
Cloud FunctionsやGoogle Cloud Platformで実施するやり方が上にあるのは、GCP上で処理を完結させたい人向け。もちろん、それで助かる人もいるし、Googleとしても自社サービスに囲い込みたいはず。その特典として、今から手順を記載するIAMにアクセスしてjsonでうんぬん、は不要だが、GCP以外の環境では動かない。
汎用性のあるやり方は「各自のサーバーで初期化する」なので今回はこちらで実施します。
Cloud Platform Console で [IAM と管理] > [サービス アカウント] にアクセスします。新しい秘密鍵を生成し、JSON ファイルを保存します。
やってみましょう。
まずはIAM と管理 > サービス アカウントにアクセスします。
どうやらプロジェクトを選択する必要があるので、選択します。
プロジェクトに登録されているサービスアカウントが一覧化されるので、上部のボタンからサービスアカウントの追加を実行します。
サービスアカウントに名前を付ける必要があるので、名前を付けます。
権限を指定する必要があるようです。いったん"オーナー"で指定したけど、これはもっと慎重に検討したほうがいいですね。
この画面でキーの作成を選択します。
キーの作成画面が出てきました。JSONが推奨との事ですし、マニュアルもJSONなのでJSONで作ります。
JSONが作成されるので、ローカルに保管します。
最初の画面に戻ると、新しいサービスアカウントが表示されました。
次に、このファイルを使用して SDK を初期化します。
やってみましょう。
特にエラーなく終了しました。
const admin = require('firebase-admin');
let serviceAccount = require('path/to/serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
let db = admin.firestore();
この時点ではfirestoreに変化はありません。
データを追加する
index.jsを以下のように編集し、データを追加します。
const admin = require('firebase-admin');
let serviceAccount = require('./myfirstcloudfirestore-8f71042e3ee3.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
let db = admin.firestore();
// usersコレクションにtaro_yamadaドキュメントを追加
let docTaroYamada = db.collection('users').doc('taroyamada');
let setTaro_yamada = docTaroYamada.set({
first: 'Taro',
last: 'Yamada',
born: 1991
});
// usersコレクションにhanako_satoドキュメントを追加
let docHanakoSato = db.collection('users').doc('hanakosato');
let setHanakosato = docHanakoSato.set({
'first': 'Sato',
'last': 'Hanako',
'born': 1998 ,
'address': 'tokyo'
});
正常にデータが追加されていました。
データを読み取る
index.jsを以下のように編集し、データを追加します。
const admin = require('firebase-admin');
let serviceAccount = require('./myfirstcloudfirestore-8f71042e3ee3.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
let db = admin.firestore();
db.collection('users').get()
.then((snapshot) => {
snapshot.forEach((doc) => {
console.log(doc.id, '=>', doc.data());
});
})
.catch((err) => {
console.log('Error getting documents', err);
});
正常にデータが読み取れました。
ルールの変更
この状態で誰でもFireStoreにデータを読み書きできてしまうので(…といっても上記で利用したJSONがないと無理だと思いますが)、ルールを少し編集してみます。公式ドキュメントに記載の通り、以下のような記載でルールを変更できるようです。
Cloud Firestore セキュリティ ルールを使ってみる | Firebase
service cloud.firestore {
match /databases/{database}/documents {
match /<some_path>/ {
allow read, write: if <some_condition>;
}
}
}
ひとまず、読み取り可・書き込み不可にしてみました。
読み取り
可能です。
書き込み
エラーが出る…かと思いきや出ませんでした。
const admin = require('firebase-admin');
let serviceAccount = require('./myfirstcloudfirestore-8f71042e3ee3.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
let db = admin.firestore();
// usersコレクションにjiro_suzukiドキュメントを追加
let docJiroSuzuki = db.collection('users').doc('jirosuzuki');
let setJiro_Suzuki = docJiroSuzuki.set({
first: 'Jiro',
last: 'Suzuki',
born: 1995
});
まぁここらへんはおいおい調べていきます。