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

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

  • 對 Node.js 10 的支援已停止(這是一項重大更改
  • SDK採用模組化API模式

本指南提供了說明和訊息,可協助開發人員將現有 Node.js 應用程式從早期版本的 Admin SDK 升級到 v10。

將 Node.js 更新到 v12 或更高版本

隨著 Admin Node.js SDK v10 版本的發布,Firebase 已停止對 Node.js 10 的支援。開發人員在使用 Admin SDK 時必須使用 Node.js 12 或更高版本。如果您將管理 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');

從 v10 開始,Admin Node.js SDK 提供了多個帶有命名導出的模組入口點。我們建議開發人員使用這些新入口點來存取 SDK 的各種 API,而不是使用全域admin命名空間。

以下是使用新模組入口點的上述範例的外觀:

打字稿

// 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 。由於每種類型都屬於一個模組,因此您可以透過它們的短名稱(例如UserRecordReference匯入它們。

以下是自 v10 起 SDK 中可用的所有模組入口點:

  • firebase-管理/應用程式
  • firebase-管理/身份驗證
  • firebase-管理/資料庫
  • firebase-管理/firestore
  • firebase-管理員/實例 ID
  • firebase-管理/機器學習
  • firebase-管理/訊息傳遞
  • firebase 管理/專案管理
  • firebase 管理/遠端配置
  • firebase 管理/安全規則
  • firebase-管理/存儲

下表顯示了每個舊命名空間函數的替換導入語法:

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

在 App 上使用導出函數代替方法

在舊版 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關鍵字。從 v10 版本開始,Admin Node.js SDK 還提供了 ES 模組支持,以便在普通 Node.js 上實現 ES 模組的開發人員可以使用import語法導入 SDK。

若要將 ES 模組與 Admin SDK 結合使用,首先請確保您已為 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');