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

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

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

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

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

隨著 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');