在 Node 專案使用 Firebase SDK 操作 Firestore 資料庫

前置作業

首先,在 Firebase 創建一個應用程式,並且創建一個 Firestore 資料庫。如果是由後端程式存取資料庫,則可以選取「鎖定模式」,避免資源被濫用。

為了讓後端程式存取資料庫,需要創建一個憑證。點選「專案設定」、「服務帳戶」,然後點選「產生新的私密金鑰」,將憑證下載到專案目錄中。

建立專案

建立專案。

1
2
mkdir firebase-firestore-node-example
cd firebase-firestore-node-example

初始化專案。

1
npm init

安裝依賴套件。

1
npm install firebase firebase-admin

修改 package.json 檔。

1
2
3
{
"type": "module"
}

新增 .gitignore 檔。

1
2
/node_modules
serviceAccountKey.json

實作

新增 collection.js 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import { cert, initializeApp } from 'firebase-admin/app';
import { getFirestore } from 'firebase-admin/firestore';
import serviceAccount from './serviceAccountKey.json' assert { type: 'json' };

initializeApp({
credential: cert(serviceAccount),
});

class Collection {
constructor(collection) {
const db = getFirestore();
this.collection = db.collection(collection);
}

async getItem(path) {
const snapshot = await this.collection.doc(path).get();
return snapshot.data();
}

async getItems() {
const snapshot = await this.collection.get();
const items = snapshot.docs.map((doc) => ({
id: doc.id,
...doc.data(),
}));
return items;
}

async addItem(value) {
const docRef = await this.collection.add(value);
return docRef.id;
}

async updateItem(key, value) {
return await this.collection.doc(key).set(value);
}

async removeItem(key) {
return await this.collection.doc(key).delete();
}

async getCount() {
return (await this.collection.count().get()).data().count;
}
}

export default Collection;

建立 index.js 檔。

1
2
3
4
5
6
7
8
9
10
11
12
import Collection from './collection.js';

const collection = new Collection('customers');

(async () => {
console.log('addItem', await collection.addItem({ name: 'Alice' }));
console.log('updateItem', await collection.updateItem('HdSVo6LxuBlizdgY3jTd', { name: 'Bob' }));
console.log('getItem', await collection.getItem('0vBJGiONCUaU9JZpShAA'));
console.log('getItems', await collection.getItems());
console.log('removeItem', await collection.removeItem('0vBJGiONCUaU9JZpShAA'));
console.log('getCount:', await collection.getCount());
})();

程式碼

參考資料