升級至 Node.js SDK Admin SDK v10 (模組 SDK)

第 10 版 Admin Node.js SDK 引進了兩項重要變更:

  • 停止支援 Node.js 10 (這是破壞性變更)
  • SDK 採用模組化 API 模式

本指南提供操作說明和相關資訊,協助開發人員將現有的 Node.js 應用程式從早期 Admin SDK 版本升級至 10 版。

將 Node.js 更新至 v12 以上版本

隨著 Admin Node.js SDK 10 版推出,Firebase 已停止支援 Node.js 10。開發人員使用 Admin SDK 時,必須使用 Node.js 12 以上版本。如果您將 Admin Node.js SDK 與 Cloud Functions for Firebase 搭配使用,請務必將 Node.js 版本升級至 12 以上

使用模組而非命名空間

自成立以來,Admin Node.js SDK 已經提供以巢狀命名空間階層結構為基礎的穩定 API。因此,您可能會熟悉編寫類似以下程式碼:

// Import the global admin namespace
import * as admin from 'firebase-admin';

const app: admin.app.App = admin.initializeApp();

const token: string = await admin.auth().createCustomToken('alice');

const user: admin.auth.UserRecord = await admin.auth().getUser('bob');

自第 10 版起,Admin Node.js SDK 提供多個模組進入點,並提供命名匯出項目。我們建議開發人員使用這些新的進入點存取 SDK 的各種 API,而非使用全域 admin 命名空間。

以下是上述範例使用新模組進入點的樣子:

TypeScript

// Import only what you need
import { initializeApp, App } from 'firebase-admin/app';
import { getAuth, UserRecord } from 'firebase-admin/auth';

const app: App = initializeApp();

const token: string = await getAuth().createCustomToken('alice');

const user: UserRecord = getAuth().getUser('bob');

Node.js

// Import only what you need
const { initializeApp } = require('firebase-admin/app');
const { getAuth } = require('firebase-admin/auth');

const app = initializeApp();

const token = await getAuth().createCustomToken('alice');

const user = getAuth().getUser('bob');

使用 v10 模組進入點

請注意,在上述範例中,您不再匯入全域 admin 命名空間。相反地,您只需明確匯入幾個模組進入點所需的符號即可。此外,TypeScript 開發人員也不再需要使用 admin.auth.UserRecordadmin.database.Reference 等三重巢狀類型 ID。由於每個類型都只屬於一個模組,您可以直接使用 UserRecordReference 等簡寫名稱匯入。

以下是 SDK 自第 10 版起提供的所有模組進入點:

  • firebase-admin/app
  • firebase-admin/auth
  • firebase-admin/database
  • firebase-admin/firestore
  • firebase-admin/instance-id
  • firebase-admin/machine-learning
  • firebase-admin/messaging
  • firebase-admin/project-management
  • firebase-admin/remote-config
  • firebase-admin/security-rules
  • firebase-admin/storage

下表列出每個舊版命名空間函式的替換匯入語法:

v9 v10
admin.initializeApp() import { initializeApp } from 'firebase-admin/app'

initializeApp();

admin.app() import { getApp } from 'firebase-admin/ap'

getApp();

admin.credential.cert() import { cert } from 'firebase-admin/app'

cert();

admin.auth() import { getAuth } from 'firebase-admin/auth'

getAuth();

admin.database() import { getDatabase } from 'firebase-admin/database'

getDatabase();

admin.firestore() import { getFirestore } from 'firebase-admin/firestore'

getFirestore();

admin.instanceId() import { getInstanceId } from 'firebase-admin/instance-id'

getInstanceId();

admin.machineLearning() import { getMachineLearning } from 'firebase-admin/machine-learning'

getMachineLearning();

admin.messaging() import { getMessaging } from 'firebase-admin/messaging'

getMessaging()

admin.projectManagement() import { getProjectManagement } from 'firebase-admin/project-management'

getProjectManagement();

admin.remoteConfig() import { getRemoteConfig } from 'firebase-admin/remote-config'

getRemoteConfig();

admin.securityRules() import { getSecurityRules } from 'firebase-admin/security-rules'

getSecurityRules()

admin.storage() import { getStorage } from 'firebase-admin/storage'

getStorage();

在應用程式上使用匯出的函式,而非方法

在舊版 API 中,App 物件公開了許多方法,例如 app.auth()app.database()。我們建議開發人員避免使用這些方法,改為使用上述相同的模組進入點,取得以特定 App 物件為範圍的服務例項,並執行其他應用程式專屬工作。

v9 v10
app.auth() import { getAuth } from 'firebase-admin/auth';

getAuth(app);

app.database() import { getDatabase } from 'firebase-admin/database';

getDatabase(app);

app.database(url) import { getDatabaseWithUrl } from 'firebase-admin/database';

getDatabaseWithUrl(url, app);

app.firestore() import { getFirestore } from 'firebase-admin/firestore'

getFirestore(app);

app.instanceId() import { getInstanceId } from 'firebase-admin/instance-id'

getInstanceId(app);

app.machineLearning() import { getMachineLearning } from 'firebase-admin/machine-learning'

getMachineLearning(app);

app.messaging() import { getMessaging } from 'firebase-admin/messaging'

getMessaging(app);

app.projectManagement() import { getProjectManagement } from 'firebase-admin/project-management'

getProjectManagement(app);

app.remoteConfig() import { getRemoteConfig } from 'firebase-admin/remote-config'

getRemoteConfig(app);

app.securityRules() import { getSecurityRules } from 'firebase-admin/security-rules'

getSecurityRules(app);

app.storage() import { getStorage } from 'firebase-admin/storage'

getStorage(app);

app.delete() import { deleteApp } from 'firebase-admin/app';

deleteApp(app);

ES 模組支援

Node.js 12 以上版本提供 ES 模組的實驗性支援,即使是非 TypeScript 開發人員也能使用程式碼中的 exportimport 關鍵字。自第 10 版起,Admin Node.js SDK 也提供 ES 模組支援功能,讓在純 Node.js 上實作 ES 模組的開發人員可以使用 import 語法匯入 SDK。

如要搭配 Admin SDK 使用 ES 模組,請先確定已為 Node.js 執行階段啟用 ESM 支援。一般而言,只要在 package.json 檔案中加入 "type": "module" 欄位即可。接著,您可以編寫如下的應用程式程式碼:

// With {type: module} in the package.json...

// Import only what you need
import { initializeApp }  from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';

const app = initializeApp();

const token = await getAuth().createCustomToken('alice');

const user = getAuth().getUser('bob');