LoginSignup
2
3

More than 3 years have passed since last update.

Firebase Cloud Firestoreを使ってみる(Windows)(node.js)(2019/10/5)

Posted at

やること

Firebaseで便利に使えるデータベース"Firestore"にデータを書き込み、読み書きしてみます。環境はnode.js。

参考にしたサイト

プロジェクトの作成

firebaseポータルからプロジェクトの作成

image.png

プロジェクトに名前を付ける

image.png

GoogleAnalyticsは有効化する

image.png

image.png

image.png

データベースの作成

image.png

データベースのセキュリティ保護ルール設定

ひとまずテストモードで作成

image.png

テストモード

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を選択。

image.png

データベースが完成

image.png

データベースの初期化

環境の作成


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 と管理 > サービス アカウントにアクセスします。

image.png

どうやらプロジェクトを選択する必要があるので、選択します。

image.png

プロジェクトに登録されているサービスアカウントが一覧化されるので、上部のボタンからサービスアカウントの追加を実行します。

image.png

サービスアカウントに名前を付ける必要があるので、名前を付けます。

image.png

権限を指定する必要があるようです。いったん"オーナー"で指定したけど、これはもっと慎重に検討したほうがいいですね。

image.png

この画面でキーの作成を選択します。

image.png

キーの作成画面が出てきました。JSONが推奨との事ですし、マニュアルもJSONなのでJSONで作ります。

image.png

JSONが作成されるので、ローカルに保管します。

image.png

image.png

最初の画面に戻ると、新しいサービスアカウントが表示されました。

image.png

次に、このファイルを使用して SDK を初期化します。

やってみましょう。

image.png

image.png

特にエラーなく終了しました。

index.js

const admin = require('firebase-admin');
let serviceAccount = require('path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

let db = admin.firestore();

この時点ではfirestoreに変化はありません。

image.png

データを追加する

index.jsを以下のように編集し、データを追加します。

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'
});

正常にデータが追加されていました。

image.png

データを読み取る

index.jsを以下のように編集し、データを追加します。

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);
  });

正常にデータが読み取れました。

image.png

ルールの変更

この状態で誰でもFireStoreにデータを読み書きできてしまうので(…といっても上記で利用したJSONがないと無理だと思いますが)、ルールを少し編集してみます。公式ドキュメントに記載の通り、以下のような記載でルールを変更できるようです。

Cloud Firestore セキュリティ ルールを使ってみる  |  Firebase

service cloud.firestore {
  match /databases/{database}/documents {
    match /<some_path>/ {
      allow read, write: if <some_condition>;
    }
  }
}

ひとまず、読み取り可・書き込み不可にしてみました。

image.png

読み取り

可能です。

image.png

書き込み

エラーが出る…かと思いきや出ませんでした。

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コレクションにjiro_suzukiドキュメントを追加
let docJiroSuzuki = db.collection('users').doc('jirosuzuki');

let setJiro_Suzuki = docJiroSuzuki.set({
  first: 'Jiro',
  last: 'Suzuki',
  born: 1995
});

image.png

まぁここらへんはおいおい調べていきます。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3