[firebase] firebase SDKとfirebase-admin SDKでfirestoreをそれぞれ呼び出してみる

2023/11/26

Node.js
firebase

こんにちは。

今回は、firebase SDKとfirebase-admin SDKでfirestoreをそれぞれ呼び出してみたときの違いを紹介します。

firebase SDKとfirebase-admin SDKの違い

Admin SDK は、特権環境から Firebase を操作するために使用するサーバー ライブラリのセットであり、次のような操作を行うことができます。

  • Realtime Database のデータの読み取りと書き込みを完全な管理者権限で実行する。
  • Firebase Cloud Messaging サーバー プロトコルへの簡単な代替アプローチを使用して、プログラムにより Firebase Cloud Messaging メッセージを送信する。
  • Firebase Auth トークンを生成し確認する。
  • Google Cloud リソース(Cloud Storage バケットや、Firebase プロジェクトに関連付けられた Cloud Firestore データベースなど)にアクセスする。
  • 独自の簡単な管理コンソールを作成して、認証のためにユーザーデータの検索やユーザーのメールアドレス変更などの作業を行う。

特権環境(サーバーなど)からの管理者アクセスではなく、エンドユーザー アクセスのクライアントとして Node.js SDK を使用することを検討している場合(Node.js デスクトップ、IoT アプリケーションなど)、このドキュメントではなく、クライアント JavaScript SDK の設定に関する手順をご覧ください。

引用元: https://firebase.google.com/docs/admin/setup?hl=ja

ということで、クライアントサイドでfirebaseを使う場合は、firebase SDK、サーバーサイドでfirebaseを使う場合は、firebase-admin SDKを利用すれば良さそうです。

firebase SDKでfirestoreを呼び出す

firebase SDKでfirestoreを呼び出すには、以下のようにします。

データの呼び出し

import { initializeApp } from 'firebase/app';
import { getFirestore, collection, getDocs } from 'firebase/firestore/lite';
// Follow this pattern to import other Firebase services
// import { } from 'firebase/<service>';

// TODO: Replace the following with your app's Firebase project configuration
const firebaseConfig = {
  //...
};

const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

// Get a list of cities from your database
async function getCities(db) {
  const citiesCol = collection(db, 'cities');
  const citySnapshot = await getDocs(citiesCol);
  const cityList = citySnapshot.docs.map(doc => doc.data());
  return cityList;
}

データの追加

import { initializeApp } from 'firebase/app';
import { getFirestore, collection, addDoc } from 'firebase/firestore/lite';
// Follow this pattern to import other Firebase services
// import { } from 'firebase/<service>';

// TODO: Replace the following with your app's Firebase project configuration
const firebaseConfig = {
  //...
};

const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

try {
  const docRef = await addDoc(collection(db, "users"), {
    first: "Ada",
    last: "Lovelace",
    born: 1815
  });
  console.log("Document written with ID: ", docRef.id);
} catch (e) {
  console.error("Error adding document: ", e);
}

データの更新

import { initializeApp } from 'firebase/app';
import { doc, updateDoc } from "firebase/firestore";
// Follow this pattern to import other Firebase services
// import { } from 'firebase/<service>';

// TODO: Replace the following with your app's Firebase project configuration
const firebaseConfig = {
  //...
};

const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

const washingtonRef = doc(db, "cities", "DC");

// Set the "capital" field of the city 'DC'
await updateDoc(washingtonRef, {
  capital: true
});

データの削除

import { initializeApp } from 'firebase/app';
import { doc, deleteDoc } from "firebase/firestore";
// Follow this pattern to import other Firebase services
// import { } from 'firebase/<service>';

// TODO: Replace the following with your app's Firebase project configuration
const firebaseConfig = {
  //...
};

const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

await deleteDoc(doc(db, "cities", "DC"));

firebase-admin SDKでfirestoreを呼び出す

firebase-admin SDKでfirestoreを呼び出すには、以下のようにします。

データの呼び出し

import { initializeApp, cert } from 'firebase-admin/app'
import { getFirestore } from 'firebase-admin/firestore'

const serviceAccountKey = require('../serviceAccountKey.json')
const app = initializeApp({
  credential: cert(serviceAccountKey)),
  databaseURL: '指定されたURL',
})
const db = getFirestore(app)

const getUsers = async () => {
  const usersSnapshot = await db.collection('cities').get()
  usersSnapshot.forEach((doc) => {
    console.log(doc.id, ' => ', doc.data())
  })
}

データの追加

import { initializeApp, cert } from 'firebase-admin/app'
import { getFirestore } from 'firebase-admin/firestore'

const serviceAccountKey = require('../serviceAccountKey.json')
const app = initializeApp({
  credential: cert(serviceAccountKey)),
  databaseURL: '指定されたURL',
})
const db = getFirestore(app)

const addUsers = async (id) => {
  const userRef = await db.collection('users').doc(id)
  userRef.set({
    first: 'Ada',
    last: 'Lovelace',
    born: 1815
  })
}

データの更新

import { initializeApp, cert } from 'firebase-admin/app'
import { getFirestore } from 'firebase-admin/firestore'

const serviceAccountKey = require('../serviceAccountKey.json')
const app = initializeApp({
  credential: cert(serviceAccountKey)),
  databaseURL: '指定されたURL',
})
const db = getFirestore(app)

const updateUsers = async (id) => {
  const userRef = await db.collection('users').doc(id)
  userRef.update({
    first: 'Ada',
    last: 'Lovelace',
    born: 1815
  })
}

データの削除

import { initializeApp, cert } from 'firebase-admin/app'
import { getFirestore } from 'firebase-admin/firestore'

const serviceAccountKey = require('../serviceAccountKey.json')
const app = initializeApp({
  credential: cert(serviceAccountKey)),
  databaseURL: '指定されたURL',
})
const db = getFirestore(app)

const deleteUsers = async (id) => {
  const userRef = await db.collection('users').doc(id).delete()
}

今回はこのあたりで。